7

私が得ているエラー:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized
{
  "code" : 401,
  "errors" : [ {
    "domain" : "global",
    "location" : "Authorization",
    "locationType" : "header",
    "message" : "Invalid Credentials",
    "reason" : "authError"
  } ],
  "message" : "Invalid Credentials"
}

コードの下で、私は使用しています:

GoogleCredential credential = new GoogleCredential.Builder()
    .setTransport(this.TRANSPORT).setJsonFactory(this.JSON_FACTORY)
    .setClientSecrets(Constants.CLIENT_ID, Constants.CLIENT_SECRET).build();
credential.setAccessToken(tokenResponse.getAccessToken());
credential.setAccessToken(tokenResponse.getRefreshToken());

ここまでで、リフレッシュトークン、アクセストークンなどを取得

Oauth2 userInfoService = new Oauth2.Builder(this.TRANSPORT,
        this.JSON_FACTORY, credential.getRequestInitializer())
        .setApplicationName(Constants.APPLICATION_NAME).build();

以下の行で失敗します: (わからない、なぜ?)

Userinfo userInfo = userInfoService.userinfo().get().execute();

私はウェブで検索しましたが、その例と珍しい資料はほとんどありません。体はそれについて何か考えがありますか?

私は何を間違っていますか?

4

3 に答える 3

5

credential.getRequestInitializer()がnullだと思います。

このようにカスタムリクエストイニシャライザを資格情報オブジェクトに設定することでこれを解決しました

GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(this.TRANSPORT).setJsonFactory(this.JSON_FACTORY)
.setClientSecrets(Constants.CLIENT_ID, Constants.CLIENT_SECRET).setRequestInitializer((new HttpRequestInitializer(){
                @Override
                public void initialize(HttpRequest request)
                        throws IOException {
                    request.getHeaders().put("Authorization", "Bearer " + accessToken);
                }
            })).build()

Google のドキュメントでは、次のように指定されています。

** たとえば、access_token クエリ文字列パラメーターを使用した UserInfo API の呼び出しは次のようになります。

GET https://www.googleapis.com/oauth2/v1/userinfo?access_token= {accessToken} HTTP ヘッダーのアクセス トークンを使用して同じ API を呼び出すと、次のようになります。

GET /oauth2/v1/userinfo HTTP/1.1 認証: Bearer {accessToken} ホスト: googleapis.com**

これがあなたを助けることを願っています

于 2012-07-25T00:54:16.920 に答える
1

すでにアクセス トークン ( GoogleTokenResponse ) を取得している場合は、次のこともできます。

HttpTransport transport = new NetHttpTransport();

List<String> applicationScopes = Arrays.asList(
  PlusScopes.USERINFO_EMAIL,
  PlusScopes.USERINFO_PROFILE
);

GoogleAuthorizationCodeFlow flow
  = new GoogleAuthorizationCodeFlow.Builder(
    transport,
    JacksonFactory.getDefaultInstance(),
    "your-client-id.apps.googleusercontent.com",
    "your-client-secret",
    applicationScopes).build();

String userId = googleTokenResponse.parseIdToken().getPayload().getSubject();
Credential credential = flow.createAndStoreCredential(googleTokenResponse, userId);
HttpRequestFactory requestFactory = transport.createRequestFactory(credential);

GenericUrl url = new GenericUrl("https://www.googleapis.com/oauth2/v1/userinfo");
HttpRequest request = requestFactory.buildGetRequest(url);
String userIdentity = request.execute().parseAsString();

は次のuserIdentityようになります。

{
  "id": "105358994046791627189",
  "name": "Benny Neugebauer",
  "given_name": "Benny",
  "family_name": "Neugebauer",
  "link": "https://plus.google.com/+BennyNeugebauer",
  "picture": "https://lh4.googleusercontent.com/-dtvDIXCEtFc/AAAAAAAAAAI/AAAAAAAAAoE/1CKd3nH9rRo/photo.jpg",
  "gender": "male",
  "locale": "de"
}

userIdentity必要に応じて、Jackson を使用して独自のクラスに解析できます。

ObjectMapper mapper = new org.codehaus.jackson.map.ObjectMapper();
mapper.readValue(userIdentity, YourUser.class);

この例で使用した依存関係は次のとおりです。

<dependency>
  <groupId>com.google.apis</groupId>
  <artifactId>google-api-services-plus</artifactId>
  <version>v1-rev401-1.22.0</version>
</dependency>

<dependency>
  <groupId>org.codehaus.jackson</groupId>
  <artifactId>jackson-mapper-asl</artifactId>
  <version>1.9.13</version>
  <type>jar</type>
</dependency>
于 2016-06-19T15:59:18.897 に答える
0

Userinfo APIからデータを取得するには、OAuthスコープへのアクセスをリクエストする必要があります。

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

https://www.googleapis.com/auth/userinfo.email電子メールアドレスを取得する場合は、スコープも追加します。

あなたのコードでは、アクセスを要求しているOAuthスコープをどこに設定したのかわかりません。

于 2012-07-22T18:15:13.217 に答える