【问题标题】:OAuth: Send Access Token and Get User dataOAuth:发送访问令牌并获取用户数据
【发布时间】:2013-01-06 15:27:06
【问题描述】:

我正在尝试使用 Google OAuth。我正在开发在 IBM WebSphere 服务器上运行的 Web 应用程序。应用的框架是SpringMVC。

我正在尝试获取 userinfo.profile。我已成功获得访问令牌,但找不到使用此令牌和获取用户信息的方法。

我正在将浏览器重定向到此 URL https://www.googleapis.com/oauth2/v2/userinfo?access_token="+access.getAccessToken(); 但出现错误

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "authError",
    "message": "Invalid Credentials",
    "locationType": "header",
    "location": "Authorization"
   }
  ],
  "code": 401,
  "message": "Invalid Credentials"
 }
}

我是否可以正常使用此访问令牌,还是应该以其他形式发送请求?

我是这样发送请求的:

GenericUrl shortenEndpoint = new GenericUrl("https://www.googleapis.com/oauth2/v2/userinfo");
HttpRequest request1 = rf.buildGetRequest(shortenEndpoint);
GoogleHeaders headers = new GoogleHeaders();
headers.setContentType("application/json; charset=UTF-8");
headers.setAuthorization("OAuth " + accessToken); 
request1.setHeaders(headers);
HttpResponse shortUrl = request1.execute();

在浏览器的此 URL 中提供我的访问令牌后

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=******

我明白了

{
 "issued_to": "*****************",
 "audience": "*****************",
 "scope": "https://www.googleapis.com/auth/urlshortener",
 "expires_in": 3515,
 "access_type": "online"
}

【问题讨论】:

  • 如果您使用Authorization 标头发送令牌也会失败吗?
  • 我没试过。你能告诉我发送这个标题的任何例子吗?
  • 能否详细说明您是如何发送 http 请求的?

标签: java oauth-2.0 access-token google-oauth


【解决方案1】:

您的授权标头似乎不正确。

尝试:headers.setAuthorization("OAuth " + accessToken);

【讨论】:

  • 好的,您可以检查您的令牌是否仍然有效?您可以拨打googleapis.com/oauth2/v1/tokeninfo?access_token=yourToken查看。
  • 它返回一些数据,这意味着令牌很好,但在应用程序中使用时出错。已为令牌编辑问题。
  • 是的,令牌似乎很好。使用 access_token= 参数的请求是否在浏览器中或仅从您的应用程序中也失败?也尝试在你的代码中强制 http 方法为GET
  • 然后呢?你能告诉任何其他方式通过应用程序发送令牌吗?我错过了什么吗?
  • 我点击了这个 URL googleapis.com/oauth2/v2/userinfo?access_token=*********** 但同样的错误。在我的应用方法中是 GET。
【解决方案2】:

查看 tokeninfo 响应,颁发令牌的范围与您尝试访问的 API 不匹配。您似乎拥有https://www.googleapis.com/auth/urlshortener 范围的访问令牌。如果您想使用 userinfo API,您应该获取https://www.googleapis.com/auth/userinfo.profilehttps://www.googleapis.com/auth/userinfo.email 范围的令牌。

【讨论】:

  • 你美。什么是挖掘。如果可以选择多次投票,那么我会这样做十次。
  • 如何同时使用这两个范围?
  • 很好的发现@vlatko,谢谢。 Imran,对于多个范围,您必须在您的 url 中传递它们。它们必须用空格分隔。示例:scope=https://www.googleapis.com/auth/userinfo.email+https://www.googleapis.com/auth/userinfo.profile
  • @vlatko 嘿 vlatko,我在你的个人资料上找不到任何联系信息,所以我会尝试在这里与你联系,稍后我会删除评论。你的名字似乎是马其顿人,所以你能把你的电子邮件给我,这样我就可以联系到你并获得你关于编程工作的建议?
猜你喜欢
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
相关资源
最近更新 更多