web-dev-qa-db-fra.com

Passer les clés de l'api pour reposer l'api

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.

28
MrFoh

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:

  1. L'utilisateur rejoint votre service et obtient un ID utilisateur (par exemple 123) et une clé API.
  2. L'utilisateur souhaite demander à votre service API de mettre à jour son adresse e-mail. Il doit donc envoyer une demande à votre API, peut-être à /user/[email protected].
  3. Afin de permettre de vérifier la demande, l'utilisateur ajoute l'identifiant utilisateur et une signature à l'appel, donc l'appel devient /user/[email protected]&userid=123&sig=some_generated_string
  4. Le serveur reçoit l'appel, voit qu'il provient de l'ID utilisateur = 123 et recherche la clé API pour cet utilisateur. Il réplique ensuite les étapes pour créer la signature à partir des données, et si la signature correspond, la demande est valide.

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.

53
zombat

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);

martinbean serait le nom d'utilisateur de mon compte sur votre site Web, et 4eefab4111b2a serait ma clé API.

6
Martin Bean