新手问题 Ruby China API 使用授权码访问 401

li_xinyang · 2016年10月14日 · 最后由 li_xinyang 回复于 2016年10月14日 · 2838 次阅读

解决方法

我误以为图 2 为 access_token 导致一直出现未授权访问。在我使用下面的代号获得正确的 access_token 后这个问题就解决了。我暂时还不知道图 2 的授权码是做什么用的。

问题

https://ruby-china.org/api/v3/hello.json?access_token=我的授权码

Postman 请求状态总是 401 Unauthorized,授权信息为 WWW-Authenticate →Bearer realm="Ruby China", error="invalid_token", error_description="Access Token æ— æ•ˆ"

是我遗漏了什么地方吗?

我想使用 API 自动更新我在 Ruby-China 发的主题内容。

没看懂你在说什么?怎么调用的,细节贴上来

#1 楼 @huacnlee 更新了下问题,GET 请求我是直接使用 Postman 调用的。

Authorization 选了什么呢? 一般来说直接加 header

Authorization: Bearer your_token

也是 ok 的。

#3 楼 @gyorou 我没有选择 Authorization 因为我以为 access_token 是从 URL 传过去的。我现在试试看用下你的方法。 我在 Headers 中添加了,

GET /api/v3/hello.json HTTP/1.1
Host: ruby-china.org
Authorization: acabe162311af514ab8c72db304be4983a57c2470ed55cbxxxxxx625e6741214
Cache-Control: no-cache
Postman-Token: a56d862e-95e7-f009-d1b8-30d571797ad7

依旧是同样的问题(401)。

我参考的是 API 文档中的代码,因为我使用 GitHub 账号登陆所以并没有用户名和密码。

require "oauth2"
client = OAuth2::Client.new('client id', 'secret', site: 'https://ruby-china.org')
access_token = client.password.get_token('username', 'password')
Faraday.get("https://ruby-china.org/api/v3/hello.json?access_token=\#{access_token.token}").body

授权成功哪个不是 access_token 而是 authorize_code

#5 楼 @huacnlee https://ruby-china.org/api/v3/hello.json?authorize_code=3af338ba86b042bd5b24408b1f4bc38269c61a20d057a88c47afa2a6cadxxxx 这样吗?或者将 authorize_code 放到 Headers 里面结果是一样的,

#6 楼 @li_xinyang 😓 不是这样的流程,先去看看 OAuth 2 的介绍

#7 楼 @huacnlee 我大致知道流程是怎么样的(如下是我大致了解 OAuth 的流程),GitHub 登陆没有 Ruby-China 账号密码,怎么使用 Ruby-China 的 OAuth 呢?我可以添加 Ruby-China 的密码吗(不再绑定使用 GitHub 登陆)?

  1. 访问授权地址
  2. 在第三方平台填写第三方登陆账户密码
  3. 验证身份
  4. 在回调地址中给予授权码
  5. 在请求的时候使用授权码来验证用户身份和权限

#8 楼 @li_xinyang

curl -X 'POST' 'https://ruby-china.org/oauth/token?code=<授权码(图2)>&client_id=<应用 ID(图1)>&client_secret=<应用私钥(图1)>&redirect_uri=<登录回调地址(图1)>&grant_type=authorization_code'
{
  "access_token": "...",
  "token_type": "bearer",
  "expires_in": 86400,
  "refresh_token": "...",
  "created_at": 1476426804
}
curl -X 'GET' 'https://ruby-china.org/api/v3/hello.json?access_token=<access_token>'
{
  "user": {
    "id": 5,
    "login": "mimosa",
    "name": "Howl王",
    "avatar_url": "https://l.ruby-china.com/user/avatar/5.jpg!large"
  },
  "meta": {
    "time": "2016-10-14T12:34:58.127+08:00"
  }
}

#10 楼 @mimosa 感谢你提供的这个解决方案。我是在重置密码后通过 #4 的代码生成了 access_token

#4 楼 @li_xinyang

Authorization: Bearer acabe162311af514ab8c72db304be4983a57c2470ed55cbxxxxxx625e6741214

#12 楼 @gyorou 我在使用正确的 access_token 后解决了这个问题。图 2 生成的授权码并不可以使用。

#13 楼 @li_xinyang 好吧,其实按照 postman 里面的 authorization 勾选 oauth2 然后按说明来就是了。

#14 楼 @gyorou 看了你 #3 的建议之后我也有尝试了使用 Postman 内置的 OAuth2 来确认身份,不过确认成功了之后不能跳转(无响应)不知道是不是我在 Ubuntu 下的 App 兼容原因。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号