Java 从Oauth2谷歌联系人API获取用户信息

Java 从Oauth2谷歌联系人API获取用户信息,java,google-api,oauth-2.0,google-contacts-api,userinfo,Java,Google Api,Oauth 2.0,Google Contacts Api,Userinfo,我得到的错误: com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized { "code" : 401, "errors" : [ { "domain" : "global", "location" : "Authorization", "locationType" : "header", "message" : "Invalid Credenti

我得到的错误:

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 API检索数据,您必须请求访问其OAuth作用域:

同时添加范围
https://www.googleapis.com/auth/userinfo.email
如果要检索电子邮件地址


在您的代码中,我看不到您在哪里设置了请求访问的OAuth作用域。

我猜credential.getRequestInitializer()为空

我已经通过如下方式将自定义请求初始值设定项设置为凭证对象解决了这个问题

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()
谷歌的特点如下:

** 例如,使用access_token query string参数调用UserInfo API如下所示:

获取{accessToken} 使用HTTP头中的访问令牌对同一API的调用如下所示:

GET/oauth2/v1/userinfo HTTP/1.1 授权:承载{accessToken} 主持人:googleapis.com**


希望这将帮助您

如果您已经获得访问令牌(),那么您也可以这样做:

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();
如果需要,您可以使用Jackson将
用户标识
解析到您自己的类中:

ObjectMapper mapper = new org.codehaus.jackson.map.ObjectMapper();
mapper.readValue(userIdentity, YourUser.class);
以下是我在本例中使用的依赖项:


com.google.api
谷歌api服务升级版
v1-rev401-1.22.0
org.codehaus.jackson
杰克逊地图绘制者
1.9.13
罐子

我也添加了该范围。。。它的工作很好。。。授予访问权限后,我无法获得所需的响应。总之,我也包括了电子邮件范围。
{
  "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"
}
ObjectMapper mapper = new org.codehaus.jackson.map.ObjectMapper();
mapper.readValue(userIdentity, YourUser.class);