OAuth2

Posted mike_chang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OAuth2相关的知识,希望对你有一定的参考价值。

OAuth2

OAuth2是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,如qq登陆、微信登陆、微博登陆。


OAuth的产生
需求:有一个“云打印”网站,可以将用户存储在google的照片打印出来。用户为了使用该服务,必须让“云打印”读取自己存储在google上的照片。但google只有得到用户授权才会同意“云打印”读取这些照片。
方案1:用户把用户名密码告诉“云打印”,然后“云打印”去google获取照片并打印。
问题:1、用户的google用户名密码泄露。2、“云打印”拥有了该用户在google网盘上所有的权限,即“云打印”可以访问该用户存储在google网盘上的所有文件。3、google只能使用用户名密码认证,不能使用第三方验证,比如手机验证、邮箱验证。
OAuth2方案:使用OAuth2,”云打印”在获取用户的授权后可以从google获取一个绑定用户的token,”云打印”可以使用这个token去访问用户允许它访问的数据,且token有默认的有效时间,用户也可以手动取消token的有效性。


OAuth2名词
1、Third-party application:即”云打印”
2、Http service:即google
3、Resource Owner:用户
4、User Agent:浏览器
5、Authorization Server:认证服务器,即谷歌专门用来提供认证服务的服务器。
6、Resource Server:资源服务器,即谷歌网盘服务器。


会话机制常用的有两种
session方式:用户发送用户名密码,服务器校验并生成session并发送session id给客户端,客户端保存在cookie中,下次访问携带cookie。
token方式:区别,服务器不生成sesseion id,生成token发送给客户端,客户端可以把token放在cookie中,也可以不放在cookie中,下次访问携带token。

OAuth2使用token方式


OAuth2协议大致流程

     +--------+                               +---------------+
     |        |--(A)- Authorization Request ->|   Resource    |
     |        |                               |     Owner     |
     |        |<-(B)-- Authorization Grant ---|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(C)-- Authorization Grant -->| Authorization |
     | Client |                               |     Server    |
     |        |<-(D)----- Access Token -------|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(E)----- Access Token ------>|    Resource   |
     |        |                               |     Server    |
     |        |<-(F)--- Protected Resource ---|               |
     +--------+                               +---------------+
1、第三方应用(Client)向用户请求授权。
2、用户同意授权。(Grant,同意)
3、第三方应用带着用户的授权向认证服务器请求令牌。(Token,令牌)
4、认证服务器返回令牌。
5、第三方应用带着令牌向资源服务器请求资源。
6、资源服务器返回资源。

 Authorization Grant——用户授权有四种模式
1、授权码模式
2、密码模式
3、简化模式
4、客户端模式


授权码模式

     +----------+
     | Resource |
     |   Owner  |
     |          |
     +----------+
          ^
          |
         (B)
     +----|-----+          Client Identifier      +---------------+
     |         -+----(A)-- & Redirection URI ---->|               |
     |  User-   |                                 | Authorization |
     |  Agent  -+----(B)-- User authenticates --->|     Server    |
     |          |                                 |               |
     |         -+----(C)-- Authorization Code ---<|               |
     +-|----|---+                                 +---------------+
       |    |                                         ^      v
      (A)  (C)                                        |      |
       |    |                                         |      |
       ^    v                                         |      |
     +---------+                                      |      |
     |         |>---(D)-- Authorization Code ---------‘      |
     |  Client |          & Redirection URI                  |
     |         |                                             |
     |         |<---(E)----- Access Token -------------------‘
     +---------+       (w/ Optional Refresh Token) 

Resource Owner——个人用户  Client——第三方应用后台服务器  User Agent——用户代理,即浏览器  Authorization Server——认证服务器

CSDN使用qq授权登陆:
1、在csdn.net注册页面点击qq小图标,浏览器访问:https://passport.csdn.net/v1/register/authorization?authType=qq
这是csdn.net的一个地址,authType=qq表示使用qq授权登陆;另外csdn.net还支持github、微博、百度、脉脉的授权登陆
解释:
a、Resource Owner通过浏览器访问Client注册页面,点击qq小图标,访问Client接口https://passport.csdn.net/v1/register/authorization?authType=qq,表示自己要通过qq授权登陆
b、接着Client调用腾讯对外开放的接口https://graph.qq.com/oauth2.0/show?which=Login&display=pc&client_id=100270989&response_type=code&redirect_uri=https://passport.csdn.net/account/login?pcAuthType=qq&state=test
  此次Client携带的参数:response_type=code,表示使用授权码模式;client_id,表示客户端标识,即上图中的Client Identifier;redirect_uri表示重定向url,即上图中的Redirection URI;state为了防止csrf攻击。
  此次用户输入的参数:qq用户名、qq密码,即上图中的 User authenticates
2、Authorization Server返回Authorization Code到浏览器,并使浏览器重定向到1步骤里指定的Client接口——redirect_uri。
3、Client后台服务器携带Authorization Code和Redirection URI直接访问Authorization Server
4、Authorization Server返回Access Token、Refresh Token到Client后台服务器,并使用后台服务器重定向到资源服务器

 

以上是关于OAuth2的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS Crypto RS-SHA256 和 JWT 承载

如何保护来自iframe的Oauth2隐式流

基于散列片段的安全性究竟是如何工作的?

如何在Angular2 rc3路由中处理来自oauth重定向url的哈希片段

OAuth2.0学习(4-1)Spring Security OAuth2.0 - 代码分析

低代码如何构建支持OAuth2.0的后端Web API