从Oauth2 Google Contacts API获取Userinfo
我得到的错误:
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();
我在网上搜索过,我得到的实例和稀有材料都很少。 有没有人知道呢?
我究竟做错了什么?
我猜是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 **
希望对你有帮助
如果您已获得访问令牌( GoogleTokenResponse ),那么您也可以这样做:
HttpTransport transport = new NetHttpTransport(); List 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": "http://sofzh.miximages.com/java/photo.png", "gender": "male", "locale": "de" }
如果你想要,你可以使用Jackson将userIdentity
解析为你自己的类:
ObjectMapper mapper = new org.codehaus.jackson.map.ObjectMapper(); mapper.readValue(userIdentity, YourUser.class);
以下是我用于此示例的依赖项:
com.google.apis google-api-services-plus v1-rev401-1.22.0 org.codehaus.jackson jackson-mapper-asl 1.9.13 jar
要从Userinfo API检索数据,您必须请求访问其OAuth范围:
https://www.googleapis.com/auth/userinfo.profile
如果要检索电子邮件地址,还要添加范围https://www.googleapis.com/auth/userinfo.email
。
在您的代码中,我看不到您在哪里设置要请求访问的OAuth范围。
- 使用Google Spreadsheet API在Google中的Google驱动器中创建电子表格
- 如何使用Google Dictionary作为API?
- 使用工具:overrideLibrary =“org.springframework.android.rest.test”强制使用
- 问题com.google.gdata.util.ResourceNotFoundException:Google Analytic无法找到
- 没有MapActivity的MapView
- 从谷歌api存储的凭据重用java
- 使用Java blogger API v3动态发布在博客上
- 将经度和经度传递给Android中的Google API地方搜索
- 我可以通过编程方式创建Google帐户吗?