我得到的错误:
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();
我在网上搜索,得到的例子和稀有材料很少。有人知道吗?
我做错了什么?
我猜凭据.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()
谷歌的文档具体说明如下:
**例如,使用access_token查询字符串参数对UserInfo API的调用如下所示:
得到https://www.googleapis.com/oauth2/v1/userinfo?access_token={accessToken}使用HTTP头中的访问令牌对同一API的调用如下所示:
获取/oauth2/v1/userinfo HTTP/1.1授权:Bearer{accessToken}主机:googleapis.com**
希望这将帮助您
如果您已经获得了访问令牌(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"
}
如果您愿意,您可以使用Jackson:将userIdentity
解析为自己的类
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>
为了从Userinfo API检索数据,您必须请求访问其OAuth范围:
https://www.googleapis.com/auth/userinfo.profile
如果要检索电子邮件地址,还应添加作用域https://www.googleapis.com/auth/userinfo.email
。
在您的代码中,我看不出您在哪里设置了请求访问的OAuth范围。