欢迎各位兄弟 发布技术文章
这里的技术是共享的
比如我们可以使用微博登录简书,简书会自动将你的微博头像设置为你的简书头像,将你的微博昵称设置为你的简书昵称,甚至还可以获取你微博中的好友列表,提示你哪些朋友已经在使用简书,这是如何做到的呢?
最传统的办法是让用户直接在简书的登录页面输微博的账号和密码,简书通过用户的账号和密码去微博那里获取用户数据,但这样做有很多严重的缺点:
为了解决以上的问题,OAuth 协议应运而生。
新浪微博作为服务提供商,拥有用户的头像、昵称、邮箱、好友以及所有的微博内容,简书希望获取用户存储在微博的头像和昵称,假设它们是三个人:
以上是 OAuth 认证的大概流程。在使用微博授权之前,简书需要先在微博开放平台上注册应用,填写自己的名称、logo、用途等信息,微博开放平台颁发给简书一个应用 ID 和叫 APP Secret 的密钥,在实际对接中,会使用到这两个参数。
接下来分步详细解释上图中每步都做了什么:
用户点击简书上的微博登录按钮,跳转到微博授权页面。微博登录按钮的链接形如下方的 URL:
https://api.weibo.com/oauth2/authorize?client_id=123050457758183&redirect_uri=http://jianshu.com/callback
URL 中要包含以下参数:
点击以上链接后跳转到微博的授权页面如下图:
这个页面会告诉用户第三方应用要获取用户的哪些数据,以及拥有什么权限,比如在上图中简书会要求获得个人信息、好友关系、分享内容到微博以及获得评论的权限,用户点击“允许”则表示允许简书获得这些数据,进行下一步
页面自动跳转到初始参数中redirect_uri
定义的那个URL,并自动在 URL 末尾添加一个 code
参数,实际跳转的地址形如:
http://jianshu.com/callback?code=2559200ecd7ea433f067a2cf67d6ce6c
第三步,简书通过上一步获取的 code 参数换取 Token,Token 就是前文中说到的钥匙。简书请求如下的接口获取 Token:
POST https://api.weibo.com/oauth2/access_token
要包含以下参数:
通过第三步的请求,接口返回 Token 和相关数据:
{
"access_token": "ACCESS_TOKEN",//Token 的值
"expires_in": 1234,//过期时间
"uid":"12341234"//当前授权用户的UID。
}
在第四步中获取了access_token ,使用它,就可以去获取用户的资源了,要获取用户昵称和头像,请求如下接口:
GET https://api.weibo.com/2/users/show.json
携带参数:
通过以上的方式,在简书和新浪微博中间建立了一个独立的权限层,这个权限由用户赋予,可以被用户随时取消,不同第三方应用之间相互独立,互不干扰,这样就彻底解决了明文存放账号密码的问题。
以上只是以新浪微博为例,概括了一种最常见的 OAuth2.0 认证方式,关于 OAuth 更全面的文档,请参见 RFC 6749。阮一峰博客上也写过一篇关于 OAuth 的科普,推荐阅读:《理解OAuth 2.0》