• Tags
  • Politique de confidentialité
Menu
Communauté en ligne pour les développeurs

Authentifier par programme pour Google avec OAuth2

Comment authentifier par programme pour Google?
Maintenant que ClientLogin (https://developers.google.com/accounts/docs/AuthForInstalledApps)
est obsolète, comment peut-on effectuer un programmatique de l'authentification de Google avec OAuth2?

Avec ClientLogin nous pourrions effectuer un post
https://www.google.com/accounts/ClientLogin
avec l'email et le mot de passe des paramètres et d'obtenir le jeton d'authentification.

Avec OAuth2 je ne peux pas trouver une solution!

#

Mon application java processus d'arrière-plan.
J'ai vu, en suivant ce lien: developers.google.com/accounts/docs/OAuth2InstalledApp#refresh comment obtenir un nouveau jeton d'accès à l'aide d'un jeton d'actualisation.

Le problème est que je ne peux pas trouver un exemple java sur la façon d'instancier une Analytique de l'objet (par exemple) pour effectuer une requête lorsque j'ai un nouveau jeton d'accès valide

C'est mon code qui renvoie un 401 informations d'identification non valides lors de l'appeler le "execute()":

public class Test {

static final String client_id = "MY_CLIENT_ID";
static final String client_secret = "MY_SECRET";
static final String appName = "MY_APP";

private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
private static final JsonFactory JSON_FACTORY = new JacksonFactory();

static String access_token = "xxxx";
static String refreshToken = "yyyyy";

public static void main (String args[]){

    try {

        GoogleCredential credential = 
            new GoogleCredential.Builder()
                .setTransport(HTTP_TRANSPORT)
                .setJsonFactory(JSON_FACTORY)
                .setClientSecrets(client_id, client_secret).build();
        credential.setAccessToken(access_token);
        credential.setRefreshToken(refreshToken);
        //GoogleCredential
        Analytics analytics = Analytics.builder(HTTP_TRANSPORT, JSON_FACTORY)
            .setApplicationName(appName)
            .setHttpRequestInitializer(credential)
            .build();

        Accounts accounts = analytics.management().accounts().list().execute();
    } catch (Exception e) {
        e.printStackTrace();
    } 
}

Quel est le problème?

  • J'ai documenté un exemple d'utilisation de Javascript et de l'obtention d'un Jeton d'Autorisation ici alexroque.com/?p=307 j'espère que ça aide, Ce que vous voulez faire est de vous assurer notre retour URI est configuré correctement dans votre API console et que vous analyser le jeton correctement à partir de la réponse.
  • pourriez-vous svp poster votre solution et comment il est résolu. Je suis face à un même problème
  • pouvez-vous s'il vous plaît poster le code de votre solution.
  • Pour ceux qui recherchent une solution, j'ai posté un comme une réponse stackoverflow.com/a/34561285/752167
InformationsquelleAutor Andrea Zonzin | 2012-05-31
google-logingoogle-oauthjava
  1. 16

    Vérifier l'authentification OAuth 2 flux pour l'Application Installée:

    https://developers.google.com/accounts/docs/OAuth2InstalledApp

    Il nécessite encore à l'utilisateur de s'authentifier avec un navigateur la première fois, mais ensuite, vous pouvez stocker le jeton d'actualisation et de l'utiliser pour les demandes suivantes.

    Pour des solutions de rechange, vérifiez que le Dispositif d'écoulement ou de Comptes de Service, ils sont expliqués dans le même ensemble de documents.

    • - Je vérifier l'authentification OAuth 2 flux pour l'Application Installée, mais il soes pas expliquer comment actualiser le jeton d'accès et comment effectuer un accès hors connexion (j'ai besoin de l'accès hors connexion à mon bacgrond processus). J'ai donc suivi OAuth2 pour les Applications de Serveur Web (ici de l'accès hors connexion est documenté), mais j'ai encore des problèmes. 1) j'ai effectuer la première demande via le navigateur et j'ai obtenir autenticaton code pour un accès hors ligne 2) - je effectuer une java post de le code d'authentification et d'obtenir l'accès jeton jeton d'actualisation
    • Ici est la façon dont vous utilisez un jeton d'actualisation pour obtenir un nouveau jeton d'accès: developers.google.com/accounts/docs/OAuth2InstalledApp#refresh
    • Je modifie ma question avec un exemple de code pour mieux expliquer mon problème
    • Vérifier le Google Drive Java tutoriel complet d'un exemple montrant comment résoudre tous les cas de bord dans le OAuth flux: developers.google.com/drive/examples/java
    • Le Google drive tutoriel parle d'une webapp et d'une session utilisateur. J'ai besoin d'un accès hors ligne, de télécharger les données dans un planifiée backgrond processus.
    • Un grand merci Claudio. Avec Google Drive tutoriel, j'ai trouvé des réponses pour tous mes problèmes! Juste une question: le tutoriel utilise des classes com.google.l'api.services.oauth2.Oauth2 et com.google.l'api.services.oauth2.de modèle.Userinfo pour obtenir de l'utilisateur de l'info. Dans la dernière google-api-java-client ces classes ne sont pas présents. Savez-vous comment puis-je obtenir les infos de l'utilisateur avec la nouvelle version de google-api-java-client?
    • Le pot devrait être disponible ici: code.google.com/p/google-api-java-client/wiki/APIs#oauth2
    • $Andrea, si vous avez trouvé une solution, il serait utile pour les autres de voir ce qu'il a fini par être. Répondre à la question avec ce qui a fonctionné et de l'accepter!
    • Je serais vraiment reconnaissant si vous pouvez m'aider, stackoverflow.com/questions/23010509/... Pour l'instant j'ai pensé que je pourrais aussi bien aller avec votre deuxième solution.
    • J'ai ajouté un peu plus d'élaboration, comme réponse, stackoverflow.com/a/34561285/752167

    InformationsquelleAutor Claudio Cherubino
  2. 15

    J'ai trouvé le Google Java client d'être trop complexe et mal documentés. Voici pure et simple Servlet exemple avec Google Oauth2. Pour un processus d'arrière-plan, vous aurez besoin de demander access_type=hors ligne. Comme d'autres l'ont mentionné, vous avez besoin de l'utilisateur à faire une demande d'autorisation. Après cela, vous pouvez demander l'actualisation des jetons que google jetons à échéance en une heure.

    • Leur documentation peut certainement être frustrant et opaque, mais le client Java pour OAuth fourni par Google ne faire beaucoup pour vous dans les coulisses. Cela dit, je suis d'accord que c'est trop complexe dans la mise en œuvre, et l'exemple présenté ci-dessus est vraiment utile et bien distille le OAuth flux en Java. De toute façon, voir ma réponse en montrant comment le Google client pourrait être utilisé stackoverflow.com/a/34561285/752167
    • L'exemple ci-dessus fonctionne? J'ai essayé, je suis Pas de "Access-Control-Allow-Origin' en-tête est présent sur la ressource demandée. Origine 'localhost:2828' est donc pas autorisé à accéder. La réponse avait le code d'état HTTP 405. @Andrew. Merci pour l'aide
    InformationsquelleAutor Andrew
  3. 10

    Bien que j'apprécie que l'OP a été à l'origine de ciblage de l' OAuth2InstalledApp approche, je tiens à souligner une solution de travail à l'aide de la OAuth2WebServer approche. Ils ne diffèrent pas de façon significative et cela a fonctionné pour moi. J'ai trouvé le google OAuth bibliothèque être très bon, car il permettra de traiter la plupart des OAuth danse pour vous et il est facile à actualiser le jeton d'accès. La solution ci-dessous repose sur l'utilisation d'un pré-obtenu actualiser jeton.

    Que l'on a accepté la réponse des états, pour obtenir l'authentification OAuth de travail (même pour un Java processus d'arrière-plan), où la demande s'appuie sur l'accès aux données de l'utilisateur

    demande à l'utilisateur de s'authentifier avec un navigateur la première fois, mais ensuite, vous pouvez stocker le jeton d'actualisation et de l'utiliser pour les demandes suivantes.

    De précédents commentaires par l'OP, je vois les suivantes

    J'ai donc suivi OAuth2 pour les Applications de Serveur Web (ici de l'accès hors connexion est documenté), mais j'ai encore des problèmes.

    1) j'ai effectuer la première demande via le navigateur et j'ai obtenir autenticaton code pour l'accès hors connexion

    2) j'ai effectuer une java post de le code d'authentification et d'obtenir l'acces token et actualiser jeton

    La démarche que j'ai utilisée est plus comme

    1) j'ai effectuer la première demande par l'intermédiaire d'un navigateur et d'obtenir le jeton d'actualisation pour l'accès hors connexion

    2) En java, je donne le jeton d'actualisation de la bibliothèque et de la bibliothèque va obtenir le jeton d'accès etc

    plus précisément, à l'aide de la google-api-java-client de la bibliothèque le code est assez simple et remarque que je n'ai pas mis un jeton d'accès que l'OP n'a, comme je l'appelle credential.refreshToken(); ailleurs. (Je vérifie si j'ai un jeton d'accès valide déjà et si pas d'appel d'actualisation avant l'appel de l'API)

      private Credential generateCredentialWithUserApprovedToken() throws IOException,
          GeneralSecurityException {
        JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
        HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
        InputStreamReader inputStreamReader =
            new InputStreamReader(jsonFileResourceForClient.getInputStream());
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(jsonFactory, inputStreamReader);
        return new GoogleCredential.Builder().setTransport(httpTransport).setJsonFactory(jsonFactory)
            .setClientSecrets(clientSecrets).build().setRefreshToken(REFRESH_TOKEN);
      }

    Note ce couvre l'étape 2 de mon approche, et le REFRESH_TOKEN mentionné dans l'étape 1 peut être obtenu comme expliqué ci-dessous.

    Il y a d'abord un avant la mise en place d'un web app la création d'un OAuth 2.0 client ID sur le Google console pour les informations d'Identification où vous vous retrouvez avec un téléchargé le fichier json qui va être lu dans la GoogleClientSecrets objet.

    c'est à dire

    Authentifier par programme pour Google avec OAuth2

    Assurez-vous d'ajouter le Google aire de jeux rappel uri Autorisés redirect Uri

    Authentifier par programme pour Google avec OAuth2

    Alors vous avez votre identifiant client et le client secret prêt pour le terrain de jeu et vous pouvez également le télécharger au format json dont vous pouvez tirer dans votre code Java.

    Authentifier par programme pour Google avec OAuth2

    La REFRESH_TOKEN est obtenue par l'envoi d'une demande à l' google oauth aire de jeux avec la configuration suivante. Noter que, avant l'Étape 1 et de la sélection de votre portée, vous devez aller dans les paramètres pour vérifier que vous êtes en vous fournissant propres informations d'identification et d'ajouter votre identifiant client et de secret, juste en dessous

    Authentifier par programme pour Google avec OAuth2

    Noter que le type d'Accès est en mode Hors connexion, ce qui correspond à cette.

    Il ya aussi une belle explication sur l'accaparement de l'actualisation jeton ici https://www.youtube.com/watch?v=hfWe1gPCnzc

    C'est assez pour y aller et une fois mis en place!

    Concernant l'actualisation des jetons, vous devez être conscient de leur cycle de vie tel que discuté dans les docs ici

    Dans le oauthplayground vous verrez ce

    Authentifier par programme pour Google avec OAuth2

    mais sur le point 4 de l'docs ici il dit que cette

    Authentifier par programme pour Google avec OAuth2

    Hmmm.

    Pour référence, voir Comment puis-je autoriser une application (web ou installé) sans intervention de l'utilisateur? (canonique ?)

    • J'ai obtenu le jeton d'actualisation en faisant la Java de Démarrage rapide, qui ouvre un navigateur et invite l'utilisateur à la connexion. Ensuite, vous pouvez voir l'actualisation de jeton dans le débogueur par exemple. Semble être un gros hack, mais bon... ça fonctionne.
    • Vous avez fait ma journée. a la recherche de ce passé deux week-ends. Ne pas oublié d'ajouter, developers.google.com/oauthplayground dans l'uri de redirection au lieu de developers.google.com/oauthplayground (barre oblique dans le dernier)
    • Ce type de données est "jsonFileResourceForClient" et quel est-il?
    • Je vais répondre moi-même, le "jsonFileResourceForClient" est le client_secrets.json dans un InputStreamReader. Cela a fonctionné pour moi: new InputStreamReader(OAuth2TestV2.class.getResourceAsStream("/client_secrets.json"),"UTF-8") au lieu de new InputStreamReader(jsonFileResourceForClient.getInputStream());
    InformationsquelleAutor Matt C
  4. 0

    Pour les applications qui s'authentifier au nom d'eux-mêmes (c'est à dire, pour une autre application, traditionnellement en vous connectant à un compte de rôle à l'aide d'un mot de passe partagé), le OAuth2 alternative à ClientLogin proposés par Google, c'est le Service des Comptes:

    https://developers.google.com/accounts/docs/OAuth2ServiceAccount

    InformationsquelleAutor breno

Vous devez vous connecter pour publier un commentaire.

    4 réponses
    Intéressant
    Les derniers dossiers
    • la création d'une table de multiplication en python, avec la saisie de l'utilisateur
    • Désactiver le Bouton de Retour de la presse à partir de fragment
    • Comment éviter git conflits dans une équipe?
    • Angulaire de se moquer de $httpBackend donner Aucune demande en attente pour rincer
    • Quelle est la meilleure façon de le faire en virgule fixe les mathématiques?
    • RabbitMQ morte lettre de change ne jamais recevoir les messages