个人对于Oauth2.0协议的理解

参考文献:

  • https://www.cnblogs.com/cjsblog/p/9174797.html

  • https://datatracker.ietf.org/doc/rfc6749/?include_text=1

oauth2是啥:

是一个行业的标准授权协议,主要用来授权第三方应用进行获取有限的权限

oauth能干嘛

oAuth:让第三方网站具有自己的权限,获取自己的资料(微信授权给知乎登录)

实现原理

实际上就是一个授权机制,最终目的是给第三方应用颁发一个有时效性的令牌,使得第三方应用能够访问受保护的资源

oauth2.0的角色

  • 资源所有者: 资源拥有者是指拥有共享数据的人或应用。比如Facebook或者Google的用户就是是资源拥有者,他们拥有的资源就是他们的数据。
  • 资源服务器: 是指托管资源的服务器。比如,Facebook或Google就是资源服务器(或者有一个资源服务器)。
  • 授权服务器: 指授权客户端应用能够访问资源拥有者所拥有的资源(主要进行颁发令牌等)
  • 客户端: 客户端应用可以是一个请求访问用户Facebook账号的第三方游戏。(比如知乎请求微信登陆)

授权过程

1.比如现在有一个网站,点击github登陆的按钮,我使用github登陆;
2.点击了登录之后,会重定向到github的应用。用户点击登录并确认授权数据给客户端
3.授权完后,重定向回去客户端设置好的URI中,并携带一个code回去给客户端
4.客户端拿到code之后,再向授权服务器进行发送,授权服务器进行校验code,通过的话返回一个access_token,这个令牌就是第三方获取资源服务器的钥匙
5.客户端带上这个access_token去请求资源服务器,拿到用户的头像等信息

OAuth 2.0规范定义了两种客户端类型:

  • 保密的
  • 公有的

四种授权模式

  • 授权码模式
  • 简化模式
  • 密码模式
  • 客户端模式

授权码模式

  1. 用户访问客户端,用户点击用微信登陆,客户端应用重定向微信的授权服务器
  2. 客户端发送自己的client_id给授权服务器,授权服务器认证通过后,重定向回去客户端,并携带上授权码code返回去
  3. 客户端应用携带授权码继续给授权服务器发送code、client_id、client_secret,验证通过的话,授权服务器返回一个access_token
  4. 客户端就可以那这个token去请求资源服务器的资源了

跳转过去授权服务器

https://github.com/login/oauth/authorize?
  response_type=code&
  client_id=a5ce5a6c7e8c39567ca0&
  redirect_uri=https://coding.net/api/oauth/github/callback&
  scope=user:email

之后返回code给客户端

https://coding.net/api/oauth/github/callback?code=fb6a88dc09e843b33f

code去换取openid

https://github.com/login/oauth/access_token?
client_id=a5ce5a6c7e8c39567ca0&
client_secret=xxxx&
grant_type=authorization_code&
code=fb6a88dc09e843b33f&
redirect_uri=https://coding.net/api/oauth/github/callback

简化模式

简化模式(implicit grant type)不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌

  • (A)客户端将用户导向认证服务器。

  • (B)用户决定是否给于客户端授权。

  • (C)假设用户给予授权,认证服务器将用户导向客户端指定的"重定向URI",并在URI的Hash部分包含了访问令牌。

  • (D)浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值。

  • (E)资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌。

  • (F)浏览器执行上一步获得的脚本,提取出令牌。

  • (G)浏览器将令牌发给客户端。

定向到认证服务器

GET /authorize?response_type=token&client_id=s6BhdRkqt3&state=xyz
        &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
    Host: server.example.com

重定向回客户端

 HTTP/1.1 302 Found
     Location: http://example.com/cb#access_token=2YotnFZFEjr1zCsicMWpAA
               &state=xyz&token_type=example&expires_in=3600

认证服务器用HTTP头信息的Location栏,指定浏览器重定向的网址。注意,在这个网址的Hash部分包含了令牌。

根据上面的D步骤,下一步浏览器会访问Location指定的网址,但是Hash部分不会发送。接下来的E步骤,服务提供商的资源服务器发送过来的代码,会提取出Hash中的令牌。

密码模式

资源拥有者证书授权方法通过客户端应用访问资源拥有者证书来工作。比如,用户可以在客户端应用输入他的Twitter用户名及密钥(证书)。该客户端应用就可以用着用户名和密钥访问用户在Twitter的资源

客户端模式

客户端证书授权对于客户端需要在资源服务器访问资源或调用函数的情形使用,与特定的资源拥有者无关(如用户)。

端点

OAuth 2.0定义了一系列端点。端点典型的就是web服务器上的URI。比如,一个Java Servlet, JSP page, PHP
page, ASP.NET网页等等。

这些端点定义有:

授权端点 令牌端点 重定向端点

授权端点和令牌端点都位于授权服务器上,重定向端点位于客户端应用上。

授权端点

授权端点是资源拥有者所登录的授权服务器,并授权给客户端应用的端点。

令牌端点

令牌端点是在授权服务器上为了一个访问令牌,客户端应用要交换授权码,客户端标识和客户端密钥的端点。

重定向端点

重定向端点是在授权端点授权以后,资源拥有者被重定向到客户端应用的端点。

请求的参数具体说明

客户端证书授权包含下面的参数:

grant_type 必须。必须设置到客户端证书中。
scope 可选。授权的作用域。
客户端授权响应: 客户端授权响应包含下面的参数:

{ "access_token"  : "...",
  "token_type"    : "...",
  "expires_in"    : "...",
}

access_type属性是授权服务器分配的访问令牌。 token_type是被授权服务器分配的令牌类型。 expires_in属性是指访问令牌过多少秒后,就不再有效。访问令牌过期值是可选的。 新的令牌不应该被包含在这种授权类型的请求中。

密码模式

资源拥有者者密钥证书授权包含单个的请求+响应。 资源拥有者密钥证书授权请求 请求包含下面的参数:

字段必须说明
grant_type必须必须设置到密码中
username必须UTF-8编码的资源拥有者用户名。
password必须UTF-8编码的资源拥有者密码
scope可选。授权的作用域。

资源拥有者密钥证书授权响应 响应是包含访问令牌的JSON结构数据。JSON结构像这样:

{ "access_token"  : "...",
  "token_type"    : "...",
  "expires_in"    : "...",
  "refresh_token" : "...",
}

access_type属性是授权服务器分配的访问令牌。 token_type是被授权服务器分配的令牌类型。 expires_in属性是指访问令牌过多少秒后,就不再有效。访问令牌过期值是可选的。 refresh_token属性包含令牌过期后刷新的令牌。刷新的令牌用于,一旦响应返回的不再有效时,包含一个新的访问令牌。

简化模式

契约授权包含一个请求和一个响应。 契约授权请求 契约授权请求包含下面的参数:

字段必须说明
response_type必须必须被设置在令牌中
client_id必须当客户端被注册时,有授权服务器分配的客户端标识
redirect_uri可选由客户端注册的重定向URI
scope可选请求可能的作用域
state可选(推荐)任何需要被传递到客户端请求的URI客户端的状态

契约授权响应 契约授权包含下面的参数。注意,契约授权响应不是JSON:

access_token	必须。授权服务器分配的访问令牌。
token_type	必须。令牌类型。
expires_in	推荐。访问令牌过期的秒数。
scope	可选。访问令牌的作用域。
state	必须。i如果出现在授权请求期间,和请求中的state参数一样。

契约授权错误 如果授权期间发生错误,两种情况会发生。 第一种情形是,客户端没有被授权或识别。比如,请求中错误的重定向URI。这种情况下,授权服务器没有必要重定向资源拥有者到重定向URI,而是通知资源拥有者发生了错误。 第二种情形是,客户端是好的,但是发生了其他事情。这种情况下下面地错误响应会被发送到客户端,包括在重定向URI中:

  • error必须。必须是预先定义的错误码之一。参见规范查查这些错误码及它们的含义。
  • error_description可选。一段UTF-8编码的描述错误的文本。适用于开发者,而不是最终用户。
  • error_uri 可选。一个指向包含人类可读的错误信息网页的URI。
  • state 必须。如果出现在授权请求期间,和请求中的state参数一样

授权码模式

授权码授权总共由2个请求和2个响应组成。一个授权请求+响应,和一个令牌请求+响应。 授权请求
授权请求被发送到授权端点以获取一个授权码。这是请求中用到的参数:

response_type	必须。必须被设置到代码里
client_id	必须。当客户端被注册时,授权服务器要标识的客户端。
redirect_uri	可选。通过客户端注册的重定向URI。
scope	可选。请求可能的作用域。
state	可选(推荐的)。任何需要被传递到客户端请求的URI客户端的状态。

授权响应 授权响应包含了需要用来获取访问令牌的授权码。这是响应包括的参数:

code	必须。授权码
state	如果出现在请求中,必须包含。如果有的话,和客户端请求中发送的state参数一样。

授权错误 如果授权期间发生错误,两种情况会发生。 第一种情形是,客户端没有被授权或识别。比如,请求中错误的重定向URI。这种情况下,授权服务器没有必要重定向资源拥有者到重定向URI,而是通知资源拥有者发生了错误。 第二种情形是,客户端被正确地授权了,但是其他某些事情失败了。这种情况下下面地错误响应会被发送到客户端,包括在重定向URI中:

error	必须。必须是预先定义的错误码之一。参见规范查查这些错误码及它们的含义。
error_description	可选。一段UTF-8编码的描述错误的文本。适用于开发者,而不是最终用户。
error_uri	可选。 一个指向包含人类可读的错误信息网页的URI。
state	必须。如果出现在授权请求期间,和请求中的state参数一样。

令牌请求 一旦授权码被获取到了,客户端可以用它获取访问令牌。这是访问令牌请求参数:

  • grant_type 必须。必须被设置到授权码中。 code 必须。被授权服务器接收到的授权码。
  • redirect_uri 必须。如果请求URI包括在授权请求中,之后必须是相同的。 令牌响应

访问令牌请求的响应是包含访问令牌及一些更多信息的JSON字符串:

{ "access_token"  : "...",
  "token_type"    : "...",
  "expires_in"    : "...",
  "refresh_token" : "...",
}

access_type属性是授权服务器分配的访问令牌。 token_type是被授权服务器分配的令牌类型。 expires_in属性是指访问令牌过多少秒后,就不再有效。访问令牌过期值是可选的。 refresh_token属性包含令牌过期后刷新的令牌。刷新的令牌用于,一旦响应返回的不再有效时,包含一个新的访问令牌。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值