4

私はこれをやろうとしています:

https://developers.google.com/identity/sign-in/web/backend-auth#calling-the-tokeninfo-endpoint

例から Java コードを CLIENT_ID とともにコピーして貼り付けましたが、ユーザー ID、電子メール、および電子メールの検証以外の情報を取得できません。idTokenString は OK を検証します。他の誰かがこれを機能させましたか?

OAuth 2.0 Playground でこれらを要求しました。

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

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

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

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

https://www.googleapis.com/auth/plus.moments.write

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

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

https://www.googleapis.com/auth/plus.circles.members.read

user.profile だけが必要だと思いますか?

これは私のコードです:

GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
                .setAudience(Arrays.asList(CLIENT_ID))
                .setIssuer("accounts.google.com")
                .build();

        GoogleIdToken idToken = verifier.verify(idTokenString);
        System.out.println("SUCCESS!");
        System.out.println(idToken);

        if (idToken != null) {
            GoogleIdToken.Payload payload = idToken.getPayload();

            // Print user identifier
            String userId = payload.getSubject();
            System.out.println("User ID: " + userId);

            // Get profile information from payload
            String email = payload.getEmail();
            boolean emailVerified = payload.getEmailVerified();
            String name = (String) payload.get("name");
            String pictureUrl = (String) payload.get("picture");
            String locale = (String) payload.get("locale");
            String familyName = (String) payload.get("family_name");
            String givenName = (String) payload.get("given_name");

            // Use or store profile information
            // ...
            System.out.println(email);
            System.out.println(emailVerified);
            System.out.println(name);
            System.out.println(pictureUrl);
            System.out.println(locale);
            System.out.println(familyName);
            System.out.println(givenName);


        } else {
            System.out.println("Invalid ID token.");
        }
    } catch (GeneralSecurityException | IOException e) {

        System.out.println("ERRRRO! Invalid ID token.");
    }

使用: java-api-client 1.20.0

4

1 に答える 1

3

今日、同じ問題が発生しましたcom.google.api-client:google-api-client:1.22.0

しかし、私はそれを解決することができました。

問題

OAuth2 プレイグラウンドから ID トークンを取得しようとすると、このリクエストがあることに気付きました

POST /oauth2/v4/token HTTP/1.1 Host: www.googleapis.com

Google ライブラリには値がハードコーディングさTOKEN_SERVER_URLれていますGoogleOAuthConstantshttps://accounts.google.com/o/oauth2/token

修理

それを修正するために、次のクラスを作成しました

public class GoogleAuthorizationCodeTokenV4Request extends GoogleAuthorizationCodeTokenRequest {


    public GoogleAuthorizationCodeTokenV4Request(HttpTransport transport, JsonFactory jsonFactory, String clientId, String
            clientSecret, String code, String redirectUri) {
        super(transport, jsonFactory, "https://www.googleapis.com/oauth2/v4/token", clientId, clientSecret,
            code, redirectUri);
    }
}

そして、元の代わりにそれを呼び出すだけですGoogleAuthorizationCodeTokenRequest

return new GoogleAuthorizationCodeTokenV4Request(new NetHttpTransport(), JacksonFactory.getDefaultInstance(),
                clientId, secret, authToken, callBack)
                .execute();

スコープを使用profileすると、すべての情報 (写真、名前など) が含まれますid_token

于 2017-02-20T13:45:30.487 に答える