11
votes

Fournisseur de Google App moteur Oauth2

Je veux configurer une API de repos avec un fournisseur OAuth 2.0 pour l'authentification. Utilisez Python. Existe-t-il une bibliothèque pour la configuration d'un fournisseur OAuth 2.0 codé dans Python qui fonctionne sur l'App moteur? Merci.


0 commentaires

3 Réponses :


2
votes

Avez-vous vérifié le OAuth pour Python Informations sur l'article? Il dit que c'est pour "Cette référence explique comment utiliser OAuth avec des applications Python en tant que fournisseur de services".


3 commentaires

qui utilise Google pour l'authentification et non mon service qui rend mon authentification complètement dépend de Google!


Ensuite, regardez python-oauth2 pour une implémentation complète OAuth à Python.


Je pense que malgré le nom, il peut être utilisé pour créer uniquement des fournisseurs OAuth 1.0



23
votes

Support OAuth2 dans l'intégré sur les roulements du moteur Python et Java App.

dans Python Tout ce dont vous avez besoin est: p> xxx pré>

en Java, vous utiliseriez: p> xxx pré>

Voici le gestionnaire complet Python 2.7 qui vous permettra de vérifier l'utilisateur: p> xxx pré>

L'app.yaml est trivial xxx pré>

Notez que le client doit envoyer le jeton OAUTH2 dans une autorisation Autorisation: support code> HTTP Demande d'en-tête, par exemple P>

AccountManager accountManager = AccountManager.get(this);
Account[] accounts = accountManager.getAccountsByType("com.google");

// TODO: Allow the user to specify which account to authenticate with
for (Account account : accounts) {
  Log.i(TAG, "- account.name = " + account.name);
}

// Note the "oauth2:" prefix here
String authTokenType = "oauth2:https://www.googleapis.com/auth/userinfo.email";

// Note: AccountManager will cache these token, even after they've expired.
// TODO: Invalidate expired tokens, either after auth fails, or preemptively via:
// accountManager.invalidateAuthToken(accounts[0].type, token);

accountManager.getAuthToken(accounts[0], authTokenType, null, this,
    new AccountManagerCallback<Bundle>() {
      @Override
      public void run(AccountManagerFuture<Bundle> future) {
        try {
          String token = future.getResult().getString(AccountManager.KEY_AUTHTOKEN);
          Log.i(TAG, "Got KEY_AUTHTOKEN: " + token);
          // Don't forget HTTP Header "Authorization: Bearer <token>"
          callAppEngineRestApi(token); // <---- Your code here
        } catch (OperationCanceledException e) {
          Log.i(TAG, "The user has denied you access to the API");
        } catch (Exception e) {
          Log.i(TAG, "Exception: ", e);
        }
      }
    }, null);


4 commentaires

es-tu sûr? Afaik GAE prend en charge Just Oauth 1.0a


J'étais testé votre code mais ce n'est pas des travaux de produit - Exception: - J'utilisais Python 2.5.


Regardé autour de lui un peu autour de Google et Stackoverflow. C'est la seule réponse avec un bon code de travail que j'ai trouvé. (Voir les URL fournies pour un exemple complet). Travaillé pour Java aussi, par conséquent, le titre de la question peut être trompeur des utilisateurs Java.


Incroyable. M'a pris des semaines d'essayer de travailler avec Oauth 2.0 sur Appengine avec Python, ce qui semble être le seul article qui parle de oauth.get_current_user (périmètre) . Ce n'est même pas sur les docs, mais pour moi, cela fait le charme!



1
votes

Je ne peux pas commenter la réponse ci-dessus, je l'ai donc ajouté ici pour que quiconque luttait avec cet extrait:

    token = self.request.headers['Authorization'].split(' ')[1]
    url = 'https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=' + token
    oauth_response = urlfetch.fetch(url)
    if oauth_response.status_code != 200:
        raise Exception('Unable to authorise: {}/{}'.format(oauth_response.status_code, oauth_response.content))
    token_response = json.loads(oauth_response.content)
    email = token_response['email']


2 commentaires

Qu'est-ce que cela fait? Quelle est la logique derrière elle?


Il utilise une API sur Google Rest pour "décoder" le jeton au porteur, extrayant l'adresse électronique de la réponse.