Je travaille avec phil sturgeon REST_Controller pour codeigniter pour créer une api REST, jusqu'à présent, j'ai pu créer une bibliothèque simple pour générer des clés api pour les utilisateurs. Mon problème est maintenant d'envoyer l'api clé de l'API pour chaque demande, comment je fais sans avoir à l'envoyer manuellement pour chaque demande.
Vous devriez examiner la signature de la demande. Un bon exemple est Amazon S3 REST API .
L'aperçu est en fait assez simple. L'utilisateur dispose de deux informations importantes pour utiliser votre API, un identifiant utilisateur public et une clé API privée. Ils envoient l'identifiant public avec la demande et utilisent la clé privée pour signer la demande. Le serveur de réception recherche la clé de l'utilisateur et décide si la demande signée est valide. Le flux est quelque chose comme ceci:
/user/[email protected]
./user/[email protected]&userid=123&sig=some_generated_string
Cette méthodologie garantit que la clé API n'est jamais envoyée dans le cadre de la communication .
Jetez un œil à la fonction hash_hmac () de PHP, elle est populaire pour envoyer des requêtes signées. Généralement, vous demandez à l'utilisateur de faire quelque chose comme mettre tous les paramètres dans un tableau, trier par ordre alphabétique, concaténer dans une chaîne, puis hash_hmac
cette chaîne pour obtenir le sig. Dans cet exemple, vous pourriez faire:
$sig = hash_hmac("sha256",$params['email'].$params['userid'],$API_KEY)
Ajoutez ensuite que $sig
sur l'url REST comme mentionné ci-dessus.
L'idée de REST est qu'il est sans état - donc pas de sessions ou quoi que ce soit. Si vous voulez vous authentifier, c'est là que les clés entrent en jeu, et les clés doivent être transmises pour chaque demande, et chaque demande authentifie l'utilisateur (comme REST est sans état, ai-je mentionné cela?).
Il existe différentes façons de transmettre une clé. Vous pouvez le passer en tant que paramètre (c'est-à-dire http://example.com/api/resource/id?key=api_key ) ou vous pouvez le passer en tant que partie des en-têtes HTTP. J'ai vu des API qui spécifient que vous envoyez votre nom d'utilisateur et une clé API comme partie du mot de passe de l'en-tête d'autorisation d'accès de base HTTP.
Un exemple de demande:
<?php
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_URL => 'http://example.com/api/resource/id',
CURLOPT_USERPWD => 'martinbean:4eefab4111b2a'
));
$response = curl_exec($ch);
Où martinbean
serait le nom d'utilisateur de mon compte sur votre site Web, et 4eefab4111b2a
serait ma clé API.