我得到的错误:
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();
我在网上搜索过,我得到的内容和稀有材料的例子都很少。 有没有人知道呢?
我做错了什么?
答案 0 :(得分:5)
我猜 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()
Google documentation指定以下内容:
** 例如,使用access_token查询字符串参数调用UserInfo API如下所示:
获取https://www.googleapis.com/oauth2/v1/userinfo?access_token= {accessToken} 使用HTTP标头中的访问令牌调用相同的API如下所示:
GET / oauth2 / v1 / userinfo HTTP / 1.1 授权:持票人{accessToken} 主持人:googleapis.com **
希望这会对你有所帮助
答案 1 :(得分: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"
}
如果您愿意,可以使用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>
答案 2 :(得分:0)
要从Userinfo API检索数据,您必须请求访问其OAuth范围:
https://www.googleapis.com/auth/userinfo.profile
如果要检索电子邮件地址,还要添加范围https://www.googleapis.com/auth/userinfo.email
。
在您的代码中,我看不到您在哪里设置要请求访问的OAuth范围。