2017-06-29 5 views
4

J'utilise actuellement OpenID Connect/Oauth2 Implicit Flow dans une application mobile. J'amène un Web View pour que l'utilisateur se connecte et obtienne le jeton d'accès et l'expiration. Cependant, lorsque le jeton d'accès expire, dois-je demander à l'utilisateur de se connecter à nouveau? Ou y a-t-il un moyen d'obtenir un nouveau jeton d'accès en utilisant le jeton actuel, sans mettre l'utilisateur dans l'embarras. Je suppose qu'une autre option consiste à définir l'expiration du jeton comme étant très longue, mais j'ai lu que c'est une mauvaise idée.Comment obtenir un nouveau jeton d'accès dans OpenID Connect/OAuth2 Implicit Flow

Ai-je oublié quelque chose ici?

+0

Avez-vous d'utiliser le webview et le flux implicite ou est-ce votre c hoice? –

+1

J'essaie d'accéder à Couchbase Sync Gateway, et sur la base de cette discussion que j'avais sur leurs forums https: // forums.couchbase.com/t/cbl-database-name/13233/18, il semble que j'ai besoin d'utiliser le flux implicite. Mon fournisseur d'identité (keycloak) recommande d'utiliser leurs pages de connexion/inscription sur le Web - donc la vue web. – tura08

Répondre

2

Étant donné que le flux implicite n'envoie pas de jeton d'actualisation (comme expliqué dans section 9 de la RFC6746), l'utilisation de jetons d'actualisation n'est pas possible. Mais comme une solution de contournement, vous pouvez utiliser client credential grant pour obtenir un jeton d'accès.

Une solution viable consiste à suivre d'abord le flux implicite et à authentifier le client. Ensuite l'authentification d'authentification client peut être utilisée pour effectuer les appels API requis.

Demande d'échantillon (de RFC6749)

POST /token HTTP/1.1 
Host: server.example.com 
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW 
Content-Type: application/x-www-form-urlencoded 

rant_type=client_credentials 

échantillon resposne (de RFC6749)

HTTP/1.1 200 OK 
Content-Type: application/json;charset=UTF-8 
Cache-Control: no-store 
Pragma: no-cache 

{ 
    "access_token":"2YotnFZFEjr1zCsicMWpAA", 
    "token_type":"example", 
    "expires_in":3600, 
    "example_parameter":"example_value" 
} 

PS - Si vous utilisez le flux de code d'autorisation , vous pouvez utiliser refresh_token pour obtenir un nouveau jeton d'accès. Comment la demande doit être formée peut être obtenue auprès de OAuth2 documentation. Notez que pour ce faire, votre réponse d'autorisation doit contenir un `refresh_token. Un jeton d'actualisation doit être protégé en tant que justificatif d'identité pour un utilisateur. Plus peut être lu de la documentation keycloak de here

Demande d'échantillon et une réponse (de RFC6749)

Demande

POST /token HTTP/1.1 
Host: server.example.com 
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW 
Content-Type: application/x-www-form-urlencoded 

grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA 

Réponse

HTTP/1.1 200 OK 
Content-Type: application/json 
Cache-Control: no-store 
Pragma: no-cache 

{ 
    "access_token": "TlBN45jURg", 
    "token_type": "Bearer", 
    "refresh_token": "9yNOxJtZa5", 
    "expires_in": 3600 
} 
+1

Avec "Flux implicite", il n'y a pas de jeton d'actualisation. – tura08

+0

Ok, j'ai manqué cela dans la spécification "Lors de l'utilisation du flux de type subvention implicite, un jeton d'actualisation n'est pas retourné, ce qui nécessite de répéter le processus d'autorisation une fois que le jeton d'accès expire." Y a-t-il une raison quelconque pour laquelle vous ne pouvez pas utiliser le flux de code d'autorisation? –

+1

Parce que je l'utilise en conjonction avec Couchbase Sync Gateway - ils ont essentiellement recommandé de l'utiliser. Voir les forums convo que j'ai eu avec eux - forums.couchbase.com/t/cbl-database-name/13233/18 – tura08

1

La méthode recommandée consiste à utiliser un navigateur externe et le flux de code d'autorisation. Vérifiez le OAuth 2.0 for Native Apps RFC. Pour Android, il existe également une bibliothèque de support AppAuth. Avec ce flux, vous pouvez utiliser un jeton d'actualisation pour obtenir un nouveau jeton d'accès, mais il existe un problème avec un secret client (généralement nécessaire pour accéder au point de terminaison token) car vous ne pouvez pas le garder en sécurité dans une application mobile. le RFC).

Si vous décidez de rester sur WebView et Implicit Flow, ce qui n'est pas sûr (votre application peut voir le mot de passe), vous pouvez utiliser la même technique que dans les applications JavaScript - demander un nouveau jeton avec /auth?...&prompt=none URL qui retournera un nouveau jeton sans demander à l'utilisateur des informations d'identification s'il y a encore une session ouverte.

+0

J'ai regardé dans l'utilisation des onglets personnalisés de chrome. malheureusement, je ne pense pas que Keycloak permette prompt = none. – tura08

+0

prompt = none ne peut être utilisé que si vous avez un utilisateur valide connecté dans le fournisseur d'identité. Une fois les jetons expirés, il n'y aura plus de session valide (c'est ainsi que la plupart des fournisseurs d'identités le traitent). L'invite = none peut donc être utilisée avant l'expiration du jeton. Quoi qu'il en soit, refresh_tokens est la bonne façon –