web-dev-qa-db-fra.com

"Cette application souhaite: avoir un accès hors ligne" lorsque access_type = en ligne

J'ai une application Google avec l'authentification OAuth 2.0. Tout fonctionnait bien mais récemment, j'ai commencé à obtenir l'écran "Demande d'autorisation" suivant:

enter image description here

La partie étrange est que j'obtiens cet écran quand je passe access_type=online. Encore une fois, cela fonctionnait jusqu'à récemment.

Quelle peut en être la cause? TIA

Modifier:

Les portées demandées sont:

https://www.googleapis.com/auth/userinfo.email
https://www.googleapis.com/auth/userinfo.profile

J'ai déjà essayé:

  • avec et sans access_type=online
  • avec et sans approval_Prompt=auto

Éditer # 2:

Voici le code python que j'utilise pour générer l'URL d'authentification:

encoded_params = urllib.urlencode({
    "response_type" : "code",
    "client_id" : MY_CLIENT_ID,
    "scope" : " ".join(MY_SCOPES),
    "redirect_uri" : MY_REDIRECT_URI,
    "state" : random_security_token,
    "access_type" : "online",
    "approval_Prompt" : "auto",
    })

auth_url = "https://accounts.google.com/o/oauth2/auth?" + encoded_params

Mise à jour (14 octobre):

Même avec les nouvelles étendues, je reçois toujours l'écran de consentement. Récemment, je l'ai obtenu pour un nouvel appareil que j'utilisais pour l'authentification.

58
Tzach

Je pense que G le fait lorsque votre application demande un jeton et qu'il y a toujours un jeton d'accès ou d'actualisation valide pour l'utilisateur pour les étendues en question.

La solution consiste à révoquer les jetons lorsque vous en avez terminé (soit à la déconnexion de l'utilisateur, soit immédiatement après l'authentification de l'utilisateur) en émettant cette demande:

https://accounts.google.com/o/oauth2/revoke?token={token}

Vous n'avez pas à fournir d'informations d'identification d'application, juste le jeton comme argument d'URL.

(docs ici https://developers.google.com/accounts/docs/OAuth2WebServer#tokenrevoke )

J'ai eu le même problème et aucune combinaison de access_type ou approval_Prompt les valeurs semblaient le résoudre. La révocation du jeton a fait l'affaire.

Je ne sais pas comment révoquer tous les jetons en attente pour votre application, sauf si vous les avez stockés. Pour tester avec votre propre compte d'utilisateur, vous pouvez révoquer manuellement le jeton existant pour votre application ici:

https://security.google.com/settings/security/permissions
29
amwinter

Google a récemment modifié la portée du courrier électronique. Vous devez remplacer

https://www.googleapis.com/auth/userinfo.email

avec:

https://www.googleapis.com/auth/plus.profile.emails.read 

et:

https://www.googleapis.com/auth/plus.login

Ensuite, l'accès hors ligne devrait disparaître.

Voir également:

https://developers.google.com/+/api/oauth#email

Avertissement: cette portée est obsolète. Google ne prendra plus en charge cette étendue après le 1er septembre 2014. Pour plus d'informations, voir Migration vers la connexion à Google+.

Cela modifie également la façon dont l'adresse e-mail est reçue:

https://developers.google.com/+/api/auth-migration#email

Gardez également à l'esprit que vous devez activer l'API Google+ dans votre console de gestion pour que cela fonctionne.

19
dominik

En utilisant http://localhost dans le redirect_url paramètre de la demande OAuth obligera l'utilisateur à accorder un accès hors ligne la première fois qu'il s'authentifiera après chaque connexion.

18
Ian Mackinnon

Tzach. Afin de ne pas demander l'écran de consentement après la première connexion. Vous pouvez en avoir besoin pour transmettre la valeur à la fonction:

$ client-> setApprovalPrompt ("auto");

5
CK Tan

Je pense que cela a été répondu, mais je ne trouve pas le lien pour le moment.

En bref, Google a récemment apporté quelques modifications aux périmètres afin de mettre en œuvre des périmètres incrémentiels. Une partie de ces changements est que si votre application provoque une invite d'authentification, mais que l'utilisateur a déjà authentifié, Google doit demander quelque chose, donc demande un accès hors ligne. Essayez de définir

approval_Prompt=auto

pour éviter l'invite

1
pinoyyid

J'avais le même problème. Bien que je ne mette pas

access_type=online

Cependant, selon ma compréhension, la valeur par défaut

access_type 

est

online 

De: https://developers.google.com/identity/protocols/OAuth2WebServer : "Le style d'accès par défaut est appelé en ligne."

Ce qui a résolu cela pour moi a été de supprimer:

Prompt=consent

Il y a bien sûr un formulaire de consentement lors de la première utilisation, il ne s'agit pas pour l'instant d'un formulaire de consentement demandant un accès hors ligne, ce qui effraie probablement certains utilisateurs potentiels.

Je crois que le paramètre Prompt est destiné à remplacer le paramètre approbation_Prompt. Mais il semble que si je le configure sur "consentement", cela devrait simplement signifier que je veux que l'écran de consentement normal soit affiché à chaque fois, pas l'écran de consentement "accès hors ligne". Les documents ici: https://developers.google.com/identity/protocols/OpenIDConnect#Prompt ne semblent pas réfuter cette notion, donc je ne sais pas pourquoi elle se comporte de cette façon. Mais au moins j'ai pu le faire fonctionner comme je le veux, pour l'instant.

1
Paul Brackin

Eh bien, je ne sais pas si cela constitue réellement une réponse, mais j'ai trouvé que certains utilisateurs voient le:

"Avoir un accès hors ligne"

par rapport aux autres (qui obtiennent ce que je pense que vous voulez voir):

"Afficher les informations de base sur votre compte"

0
jmazin