web-dev-qa-db-fra.com

Authentification de base avec un jeton Guid pour REST api au lieu du nom d'utilisateur / mot de passe

Aperçu

Je développe une application mobile à l'aide de PhoneGap avec l'API REST pour le backend. L'API REST ne sera pas utilisée par des développeurs tiers, mais sera spécifique à l'application, donc il n'est pas nécessaire d'implémenter oAuth. Par conséquent, je prévois d'utiliser l'authentification de base où l'utilisateur saisit son nom d'utilisateur/mot de passe pour accéder aux ressources de l'API. Toutes les API la communication se fera sur SSL.

Authentification de base avec jeton

Au lieu de laisser l'application stocker le nom d'utilisateur/mot de passe et l'envoyer avec chaque demande à l'API, je préfère authentifier le nom d'utilisateur/mot de passe lors de la première demande de connexion et envoyer un jeton GUID en retour. Le client stocke ce jeton GUID et renvoie le jeton à l'API à chaque demande via l'en-tête d'autorisation, comme ceci:

Autorisation: Basic e1d9753f-a508-46cc-a428-1787595d63e4

Côté serveur, la combinaison nom d'utilisateur/GUID sera stockée sur le serveur avec une date d'expiration ainsi que les paramètres de l'appareil. Cela permettra de garder une trace du nombre d'appareils à partir desquels un utilisateur s'est connecté ainsi que d'expiration de la session une fois que le Guid a atteint l'expiration.

Cette approche semble-t-elle raisonnable et sûre?

31
badikumar

L'approche générale "Authentification avec Token" est très bonne, mais vous ne devriez pas essayer de faire fonctionner l'authentification de base d'une manière différente de ce qu'elle est supposée (après tout, c'est une norme définie). Vous devriez plutôt utiliser votre propre en-tête à des fins d'authentification. Vous pouvez trouver une très bonne description d'un tel scénario ici:

16
tpeczek

Il n'est pas nécessaire pour vous de créer des en-têtes personnalisés ou des schémas d'authentification.

Le schéma d'authentification Bearer est conçu exactement pour votre cas d'utilisation:

Authorization: Bearer e1d9753f-a508-46cc-a428-1787595d63e4

Basic l'authentification doit être la suivante:

Authorization: Basic base64EncodedUsernameAndPassword

base64EncodedUsernameAndPassword est égal à la sortie de:

base_64_encode(username + ':' + raw_password)

N'utilisez pas Basic si la valeur de texte de fin n'est pas l'algorithme exact ci-dessus.

Si vous voulez simplement mettre la valeur que vous voulez après le nom du schéma, utilisez le schéma Bearer - c'est pour cela qu'il a été inventé.

Avertissement

Bien que vous puissiez utiliser un GUID/UUID simple comme jeton, ce n'est pas vraiment un jeton sécurisé. Pensez à utiliser un JWT à la place. Les JWT peuvent être signés numériquement et attribués un TTL afin que seul le serveur le définissant puisse a) le créer et valider son authenticité et b) s'assurer qu'il n'est pas utilisé plus longtemps que ce qui est autorisé. Bien que cela - mai soit vrai pour vos données stockées sur la base du GUID, l'approche JWT ne nécessite pas l'état du serveur - elle évolue donc beaucoup mieux - et accomplit la même chose.

28
Les Hazlewood