Lors de la conception d'API REST est-il commun pour authentifier un utilisateur en premier?
Le cas d'utilisation typique, je suis à la recherche de:
- L'utilisateur veut obtenir les données. Assurez-vous cool on aime partager! Obtenir une API publique de la clé et de lire de suite!
- L'utilisateur veut enregistrer/mettre à jour les données... woah attendre! qui êtes-vous, pouvez-vous faire cela?
Je voudrais construire une fois et permettre à dire une application web, une application android ou une application iPhone pour l'utiliser.
Une API REST qui semble être un choix logique avec les exigences comme ceci
Pour illustrer ma question, je vais utiliser un exemple simple.
J'ai un objet dans une base de données, qui a une cote d'attribut (entier de 1 à 5).
Si je comprends RESTE correctement je voudrais mettre en œuvre une requête GET à l'aide de la langue de mon choix qui renvoie csv, xml ou json comme ceci:
http://example.com/product/getrating/{id}/
Dites-nous prendre en JSON nous retourner:
{
"id": "1",
"name": "widget1",
"attributes": { "rating": {"type":"int", "value":4} }
}
C'est bien pour le public face à des Api. Je reçois la partie.
Où j'ai des tonnes de question est comment puis-je combiner cela avec un modèle de sécurité? J'ai l'habitude de web-sécurité des applications où j'ai un état de la session de l'identification de mon utilisateur à tous les temps donc je peux contrôler ce qu'ils peuvent faire n'importe quoi, ils décident de m'envoyer. Ce que je comprends, ce n'est pas Reposant serait une mauvaise solution dans ce cas.
Je vais essayer d'utiliser un autre exemple d'utilisation de la même item/notation.
Si l'utilisateur "JOE" veut ajouter une notation à un élément
Cela peut être fait en utilisant:
http://example.com/product/addrating/{id}/{givenRating}/
À ce point, je tiens à stocker les données en disant que "JOE" a donné le produit {id} une cote de {givenRating}.
Question: Comment puis-je sais que la demande est venue de "JOE" et non pas "BOB".
Par ailleurs, si c'était pour les plus sensibles comme les données d'un utilisateur à un numéro de téléphone?
Ce que j'ai obtenu jusqu'à présent est:
1) Utiliser la fonctionnalité intégrée de HTTP pour authentifier à chaque demande, la plaine HTTP ou HTTPS.
Cela signifie que chaque demande maintenant prendre la forme de:
https://joe:joepassword@example.com/product/addrating/{id}/{givenRating}/
2) Utiliser une approche comme celle d'Amazon S3 avec clé privée et publique: http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/
3) Utiliser un cookie de toute façon et de briser les apatrides partie de REPOS.
La deuxième approche semble mieux pour moi, mais je suis de gauche, vous demandez-vous à faire j'ai vraiment besoin de ré-inventer toute cette histoire? Le hachage, le stockage, la génération de clés, etc, tout par moi-même?
Cela sonne un peu comme à l'aide de session dans une application web typique et la réécriture de l'ensemble de la pile vous-même, qui d'habitude me dire "Vous faites mal" surtout lorsqu'il s'agit de sécurité.
EDIT: je suppose que je devrais avez mentionné OAuth.