0%

授权登录OAuth2.0

一、通俗介绍

新浪微博就是你的家。偶尔你会想让一些人(第三方应用)去你的家里帮你做一些事,或取点东西。你可以复制一把钥匙(用户名和密码)给他们,但这里有三个问题:
1)别人拿了钥匙后可以去所有的房间
2)别人拿到你的钥匙后也许会不小心丢到,甚至故意送到它人手里。这样你都不知到谁有你家钥匙。 3)过一段时间你也许会想要回自己的钥匙,但别人不还怎么办?
OAuth 是高级钥匙: 1)你可以配置不同权限的钥匙。有些只能进大厅(读取你的微博流)。有些钥匙可以进储藏柜(读取你的相片)
2)钥匙上带着指纹验证的(指纹 = appkey)。 收到钥匙的人只能自己用,不能转让
3)你可以远程废除之前发出的钥匙相对来说, OAuth比给出用户名密码安全
1581591572(1)

二、名词介绍

  • Third-party application:第三方应用程序,本文中又称”客户端”(client),即豆瓣
  • HTTP service:HTTP服务提供商,本文中简称”服务提供商”,即qq
  • Resource Owner:资源所有者,本文中又称”用户”(user)。
  • User Agent:用户代理,本文中就是指浏览器。
  • Authorization server:认证服务器,即服务提供商专门用来处理认证的服务器。
  • Resource server:资源服务器,即服务提供商存放用户生成的资源的服务器。它与认证服务器,可以是同一台服务器,也可以是不同的服务器。

三、OAuth 2.0的运行流程

1581591999(1)

(A)用户打开客户端以后,客户端要求用户给予授权。
(B)用户同意给予客户端授权。
(C)客户端使用上一步获得的授权,向认证服务器申请令牌。
(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
(E)客户端使用令牌,向资源服务器申请获取资源。
(F)资源服务器确认令牌无误,同意向客户端开放资源。

四、客户端的授权方式

客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。OAuth 2.0定义了四种授权方式。
授权码模式(authorization code)
简化模式(implicit)
密码模式(resource owner password credentials)
客户端模式(client credentials)

五、授权码过程

  1. A网站提供一个连接,用户点击跳转到B网站。下面是A网站跳转到B网站的一个示意连接。
    https://b.com/oauth/authorize?
    response_type=code& 要求返回授权码
    client_id=CLIENT_ID& 让qq知道第三方是谁
    redirect_uri=CALLBACK_URL& 授权成功后的跳转页面
    scope=read 要求的授权范围(这里是只读)

  2. 用户跳转后,B网站会要求用户登录,授权并登录。之后会跳回 redirect_uri参数指定的网址。跳转时,传回一个授权码。
    https://a.com/callback?code=AUTHORIZATION_CODE

  3. A网站拿到授权码,就可以在后端,向B请求令牌
    https://b.com/oauth/token?
    client_id=CLIENT_ID& client_id和client_secret参数用来让B确认A的身份
    client_secret=CLIENT_SECRET& client只能后端发起
    grant_type=authorization_code& 授权方式是授权码
    code=AUTHORIZATION_CODE& 授权码值
    redirect_uri=CALLBACK_URL 令牌颁发后的回调地址

  4. B网站受到请求后,颁发令牌。具体做法是向 redirect_uri指定的网址,发送一段JSON数据
    {
    “access_token”:”ACCESS_TOKEN”, 令牌
    “token_type”:”bearer”,
    “expires_in”:2592000,
    “refresh_token”:”REFRESH_TOKEN”,
    “scope”:”read”,
    “uid”:100101,
    “info”:{…}
    }

1581595449(1)

第一步:在豆瓣官网点击qq登录
第二步:跳转到qq登录页输入用户名、密码,然后点授权并登录
第三步:个是拿到code去换tocken,另一个就是用拿到的token换用户信息
第四步:将用户信息存储起来,返回给浏览器其首页的视图。
OAuth2.0结束

六、注意点

  1. code是有时效性的,尽量在获取后的几分钟内去申请获取access_token
  2. access_token也是有过期时间的,而过期后就需要重新获取新的令牌

七、web端和移动端授权区别

web端一般是登录并授权,也就是上面的用qq登录豆瓣的例子
移动端一般是先登录然后授权,下面用微信登录自如的例子展示

1581598142(1)

  1. 用户使用微信登录自如APP
  2. 自如APP向用户申请访问用户的个人微信资料
  3. 用户点击同意(代表用户同意自如访问他的微信信息)
  4. 用户点击同意时,自如会携带一个回调地址,去微信服务器申请获取code
  5. 微信返回一个code给自如
  6. 自如携带code和回调地址,再次想微信请求获取access_token
  7. 微信将access_token返回给自如
  8. 自如以后就会通过这个access_token,去访问用户的微信资料
    细节参考:https://www.cnblogs.com/flashsun/p/7424071.html
    OAuth2.0的一个简单解释:http://www.ruanyifeng.com/blog/2019/04/oauth_design.html
    OAuth 2.0其他的授权方式:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html