Mise en œuvre d'une API RESTful d'Authentification à l'aide de jetons (Yii/Yii2)
Je fais construire une API dans Yii 1.x qui sera utilisé avec une application mobile. Une partie du processus consiste en une connexion (avec un nom d'utilisateur et mot de passe) à l'aide de la suite de JSON demande ci-dessous:-
//Demande envoyée avec un nom d'utilisateur & mot de passe
{
"request" : {
"model" : {
"username" : "bobbysmith",
"password" : "mystrongpassword"
}
}
}
//Si connecté avec succès, en retour, la réponse suivante
{
"response": {
"code": 200,
"message": "OK",
"model": {
"timestamp": 1408109484,
"token": "633uq4t0qdtd1mdllnv2h1vs32"
}
}
}
Ce jeton est assez important - une fois qu'un utilisateur est connecté sur l'application que je voudrais qu'ils aient accès à d'autres pages, qui les obligent à être connecté. Je veux de l'application mobile pour stocker ce jeton & si le même 633uq4t0qdtd1mdllnv2h1vs32 jeton se trouve dans toute les demandes ultérieures d'accepter cela comme étant une demande authentifiée (pour cet utilisateur 'bobbysmith').
Je suis un peu incertain de la meilleure façon d'aller à ce sujet, j'ai fait quelques recherches et peut oAuth a été mentionné à quelques reprises, le long de avec l'Authentification de Base via le protocole HTTPS.
Donc, en un mot ce...
- Sur l'application mobile de la page d'accueil, l'utilisateur se connecte correctement avec leur nom d'utilisateur & mot de passe & il envoie une requête à l'API.
- Cela renvoie une réponse positive (illustré ci-dessus) avec le timestamp actuel & le jeton.
- Le même utilisateur accède à une autre page de l'application/point de vue où ce jeton est un) et b) si elle correspond à ce authentifie l'utilisateur (e.g, de sorte qu'ils peuvent modifier ce compte etc..)
- Une fois que l'utilisateur clique sur "Déconnexion" ce jeton est ensuite retiré (et il ne peut plus accéder à Mon Compte etc..) - essentiellement un jeton d'authentification basée sur le système.
Quelqu'un peut peut-être expliquer la meilleure façon d'atteindre cet objectif? S'il vous plaît laissez-moi savoir si ce que j'ai dit n'est pas 100% clair et je vais vous donner plus d'informations.
Alors que je suis à l'aide de PHP, un Yii 1.x solution est l'idéal, car c'est ce que l'API actuelle est construite à l'aide.
En un mot, l'application s'assure que toutes les demandes de serveur contient un jeton de la charge ou de tête afin que ce jeton peut être récupérée sur chaque poste après, une fois déconnecté, ce jeton est tout simplement supprimé OU mis à null/vide
Vous devez vous connecter pour publier un commentaire.
Informations sur la gestion des interfaces de sécurité
Concentrer une solution qui fournit toutes les bonnes (RESTful) auth choses à la fois, ce qui sera probablement l':
Astuce: données Personnelles de l'utilisateur doit être toujours cryptés!
Peut-être une solution
Ci-dessus, vous pouvez voir les informations standard sur les interfaces de sécurité. Afin de garantir durablement la sécurité, vous pouvez essayer comme dans la partie suivante. Je suis pas sûr au sujet de votre AppSidePersitence. Peut-être que son sqlLite ou quelque chose comme ça. C'est pourquoi je ne suis pas d'indiquer un code à base de DB-Schéma, comme je l'ai fait pour Yii. Vous aurez besoin d'un espace de stockage et de persistance à l'intérieur de votre application Yii (backend) et aussi à l'intérieur de votre application (client) pour stocker des temps et des jetons.
Votre YiiDBModel
Votre AppPersitenceModel
De la manipulation de votre jeton de droit et d'assurer la sécurité de connexion
Une fois que l'utilisateur le login a été validé comme "succès" par Yii, vous créez un nouvel utilisateur-jeton avec le timestamp actuel, qui sera stockée dans votre YiiApp-DB. Dans votre YiiApp vous avez besoin pour configurer une "heure d'expiration", qui sera ajouté à le timestamp actuel, par exemple, si vous souhaitez utiliser le "timestamps": timestamp Actuel est:
1408109484
et votre heure d'expiration est fixée à3600
(qui est de 3600 sec = 1h). Alors ... votre expiration datetime qui sera envoyer via l'API est(1408109484+3600)
. Btw. Astuce: Vous n'avez pas besoin d'envoyer des attributs comme"code": 200
. Réponse-les Codes sont inclus dans votre Demande/Réponse-Tête de Données.** Réponse 200 OK-Exemple, après que l'utilisateur-connexion a réussi, détient le calcul de "expiré"-date:**
Important: Toutes les demandes que vous voulez à être fixé, doit être envoyé avec votre générés par l'Utilisateur"jeton". Qui sera probablement stockés dans votre deviceStorage. Vous pouvez gérer votre "login-unis"- vraiment Reposante si vous utilisez HTTP-Réponse-Codes droit, par exemple, 200 OK (si tout va bien) ou 401 (non autorisé, l'utilisateur n'est pas enregistrées dans ou de la session est expirée). Vous devez valider votre Demande sur Yii côté. Lire le jeton de demandes entrantes, la valider grâce à des jetons dans la base de données et de les comparer "créé"-DB avec le courant entrant Demande-Temps (HTTP-Demandes).
** Demande-Exemple de schéma par défaut sur toutes les demandes de sécurité:**
** 401 non autorisé Réponse-Exemple, jeton expiré :**
** 401 non autorisé Réponse-Exemple, l'utilisateur n'est pas connecté (pas de jeton existe dans YiiDB):**
Garder un Utilisateur de la Session en vie? C'est assez facile. Juste mettre à jour "créé"-Date de
authToken
de Table à la demande actuelle du temps. Le faire à chaque fois, une requête a été envoyée par l'utilisateur. De cette façon, la session n'expire pas, si l'utilisateur est toujours actif. Assurer, votre DB-Jeton n'est pas expiré, avant de mettre à jourexpires
-champ Date en DB. Si aucune demande d'envoi alors que la session expire, le garder en vie ne sera plus possible.Désolé, mais l'ajout de PHP-Codes, ce serait trop.
Si vous construisez une application mobile native puis la chose la plus sensée serait de compter sur la sécurité de la patrie, de la mémoire (par exemple, l'iOS trousseau) et pas un cookie de base de la solution. Sinon, comment vous avez décrit semble très bien. Tant que votre charge est envoyé sur SSL il ne marche pas vraiment d'importance si le jeton est dans la vente ou à la POSTE. Votre jeton de gestion (c'est à dire les délais d'expiration) sont des décisions d'affaires que vous avez à faire. Back-end je ferais comme vous le décrivez et maintenez-le jeton dans votre base de données et supprimer quand il est devenu obsolète pour quelles raisons, et de renvoyer un message à votre application client pour le mettre en mode déconnecté/re-demander des informations d'identification.
EDIT: regardez ce super tut à partir de la prolifique Phil de l'Esturgeon. Il a également une grande CI bibliothèque pour la construction d'API RESTful en CI qui pourrait être intéressant de regarder.
http://philsturgeon.uk/blog/2013/07/building-a-decent-api
http://code.tutsplus.com/tutorials/working-with-restful-services-in-codeigniter--net-8814
Par ce temps vous avez probablement passé à Yii2, et pour référence, la solution la plus propre serait de l'utilisation des classes pour RESTful Api, ou on peut les mettre en œuvre dans n'importe quel cadre.
Source: HttpBearerAuth.php
Les avantages sont expliqué en détail dans cet article, mais pour résumer, il est préférable d'utiliser votre solution avec en-têtes de requête, depuis des paramètres peuvent être sauvegardés dans des fichiers journaux et Basic Auth-mot de passe peut être facilement interceptées si vous n'utilisez pas le protocole SSL (vous devriez!)