【安全】 阅读 RFC6749 及理解 Oauth2.0 下的授权码模式

这篇具有很好参考价值的文章主要介绍了【安全】 阅读 RFC6749 及理解 Oauth2.0 下的授权码模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 前言

OAuth 2.0 规范来自 RFC6749。看了《Spring 微服务实战》对OAuth 2.0 的介绍后还是觉得存在一些翻译的问题。现在结合RFC6749一起重新梳理下。

1.1. 一个场景:o-stock 实现获取微信头像。

  • 结论性的东西全部来自于该文档。
  • 本文是主要以获取微信头像作为模型,对Oauth2.0知识点进行梳理和理解。
  • 重点关注授权码授权模式。
  • 借《Spring 微服务实战》的项目名 o-stock (对应Oauth2.0中的client

1.2. 本文不进行中文对照翻译,需要的话看

  • 中文译文1
  • 中文译文2

2. OAuth 2.0 授权码模式 天然适合 Web 后端技术栈

RFC6749 定义 OAuth 2.0 目前只建立在HTTP协议上。并多次提到user-agen可以交给浏览器扮演,授权码模式十分适合有独立服务器的Web 服务器。

2.1. OAuth 2.0 授权码模式解决了什么问题?

o-stock来看

  • 留住新用户,新客户可能不想在 o-stock注册,但是或许有使用微信登录的冲动。

微信 的角度看

  • 更多开发者选择微信,那么潜在的用户粘性就增大,但是微信要维护 authorization serverresource server 的角色,有不少io的开销。

从行业规范看

  • 服务器不需要用户的微信用户名、密码,用户信息更加安全。
  • 是一种已被验证的可靠流程,开发者不用再重复造轮子。
2.2. 授权码模式要点
  • 微信的 authorization server 不可能给所有o-stock 提供三方登录的功能,那么就要要求o-stock要在微信的 authorization server 上注册
  • RFC6749规定,授权码模式下,o-stock不能保存用户的微信密码,取而代之的由是 authorization servero-stock 颁发 code
  • o-stock 需要在微信的 authorization server 持有登录凭证(要让 authorization server 认识自己),带上code和登录客户端登录凭证,请求 authorization server 后可以获取access_token
  • access_token 是代替微信密码的最终产物,这个令牌可以在o-stock 保存,o-stock 可用于获取用户头像。

3. RFC6749 未交代的前置因素

  • o-stock 需要在微信的 authorization server 进行注册 (ipad上写字,由于膜的原因,比较潦草)
    rfc 6749,后端,基础,架构,安全,微信

4. 以浏览器为切入点理解微信的授权活动

拉文档里的图,现在把user-agen当作浏览器

     +----------+
     | 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)

   Note: The lines illustrating steps (A), (B), and (C) are broken into
   two parts as they pass through the user-agent.

                     Figure 3: Authorization Code Flow

4.1. 用户委托浏览器,向微信发起身份验证的GET请求

rfc 6749,后端,基础,架构,安全,微信

Note: RFC6749 并没有规范黑色线的具体实现,但是规定了红色线提交参数的具体要求

  • 红色的线条可以对照官网给的例子
授权请求:(/authorize 是微信端的url)
GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
    Host: server.example.com

4.2. 微信确认身份,委托浏览器颁发code (跟4.3.合并成一幅图)

  • 浏览器用重定向的方式告诉o-stock用户的授权请求被微信接纳,用code表示这次接纳的证据。
授权响应:(微信感知到用户同意授权,借浏览器重定向的能力向服务器颁发code)
     HTTP/1.1 302 Found
     Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz

rfc 6749,后端,基础,架构,安全,微信

4.3. 微信收到o-stock申请access_token的请求,验证身份和请求入口后颁发

授权令牌请求:
     POST /token HTTP/1.1
     Host: server.example.com
     Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
     Content-Type: application/x-www-form-urlencoded

     grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
     &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
值得一提的 Authorization: Basic

Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
也就是上文第一幅图给出的微信token, 这个需要o-stock自己存储维护。网上很多资料都说要携带client_idclient_secret,但是官网的这份代码明显没有。原因是czZCaGRSa3F0MzpnWDFmQmF0M2JW 已经能让微信识别出该请求是o-stock发起的,并且规范中也说明了授权码模式,client在已认证的情况下可以不提供client_id ,更不用说client_secret

授权令牌响应:
     HTTP/1.1 200 OK
     Content-Type: application/json;charset=UTF-8
     Cache-Control: no-store
     Pragma: no-cache

     {
       "access_token":"2YotnFZFEjr1zCsicMWpAA",
       "token_type":"example",
       "expires_in":3600,
       "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
       "example_parameter":"example_value"
     }

rfc 6749,后端,基础,架构,安全,微信

4.4. access_token 续期

令牌续期:
     POST /token HTTP/1.1
     Host: server.example.com
     Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
     Content-Type: application/x-www-form-urlencoded

     grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA

5. 后记

至此,RFC6749 的授权流程已经交代完了。使用access_token 去微信的 resource server 就能获取头像了。整个授权流程其实可以不包含resource serverresource server 后续可以跟o-stock打交道。o-stock 可以存储access_token 。在基于Oauth2.0之上又拓展了一种OIDC 用于增强认证流程(RFC6749并没有交代认证流程),该规范可以实现单点登录,此时o-stock存储OIDC规范下的id_token不失为一种更好的实现,后续搞清楚了思想再写一篇单点登录的博客记录一下。文章来源地址https://www.toymoban.com/news/detail-516335.html

到了这里,关于【安全】 阅读 RFC6749 及理解 Oauth2.0 下的授权码模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Oauth2.0 单点登录 + 第三方授权认证】用户认证、授权模式

    本文主要对 SpringSecurity Oauth 2.0 用户认证,授权码授权模式、密码授权模式,以及授权流程进行讲解 开发中,有些功能只有管理员才有,普通用户是没有的。即需要对用户的身份进行认证,是管理员还是普通用户。认证方式有两种: 身份认证: 用户在访问相应资源时对用户

    2023年04月08日
    浏览(48)
  • SpringBoot 如何使用 OAuth2 进行认证和授权

    OAuth2 是一种授权框架,可以用于实现第三方应用程序访问用户资源的安全性。在 SpringBoot 中,我们可以使用 Spring Security 和 Spring OAuth2 来实现 OAuth2 的认证和授权功能。本文将介绍如何在 SpringBoot 中使用 OAuth2 进行认证和授权。 在开始介绍如何使用 OAuth2 进行认证和授权之前,

    2024年02月13日
    浏览(25)
  • Spring OAuth2 授权服务器配置详解

    首先要创建一个Spring Boot Servlet Web项目,这个不难就不赘述了。集成 Spring Authorization Server 需要引入: OAuth2.0 Client 客户端需要注册到授权服务器并持久化, Spring Authorization Server 提供了 JDBC 实现,参见 JdbcRegisteredClientRepository 。为了演示方便这里我采用了H2数据库,需要以下依

    2024年04月13日
    浏览(32)
  • 五、SpringSecurity OAuth2扩展手机验证码授权模式

    代码仓库:地址 代码分支:lesson5 在上一篇文章中,我们使用SpringSecurity OAuth2搭建了一套授权服务,对业务系统进行统一授权管理。OAuth提供了四种授权方式: 授权码模式(authorization_code) 简化模式(implicit) 客户端(client_credentials) 密码(password) 在实际业务中上述四种模式不

    2024年02月11日
    浏览(43)
  • springboot整合springsecurity+oauth2.0密码授权模式

    本文采用的springboot去整合springsecurity,采用oauth2.0授权认证,使用jwt对token增强。本文仅为学习记录,如有不足多谢提出。 OAuth 2.0是用于授权的行业标准协议。OAuth 2.0为简化客户端开发提供了特定的授权流,包括Web应用、桌面应用、移动端应用等。 Resource owner(资源拥有者)

    2024年02月04日
    浏览(44)
  • B094-人力资源项目-微服务授权&Oauth2

    背景 微服务架构下应用散步在不同的服务器上,不是一个tomcat ,不能再基于Session 不同的服务不同的功能,都要有权限控制,不能再基于Session用Security 微服务权限控制用Redis: 微服务用Redis做权限控制数据不好存 要查Redis, 权限变动时数据库与redis需要同步,redis不好改,如

    2024年02月09日
    浏览(22)
  • 搭建spring security oauth2认证授权服务器

    下面是在spring security项目的基础上搭建spring security oauth2认证授权服务器 spring security oauth2认证授权服务器主要需要以下依赖 Spring Security对OAuth2默认可访问端点 ​/oauth/authorize​ ​​:申请授权码code,涉及类​ ​AuthorizationEndpoint​ ​ ​/oauth/token​ ​​:获取令牌token,涉及类​

    2024年01月21日
    浏览(44)
  • oauth2-resource-server授权配置介绍

    当了解这篇文章授权服务器后,对授权服务器有一定的认识,那么授权服务器生成token后,该怎么用呢,这就涉及到资源服务器,现在给大家简单介绍实现过程。 2.1 基于官网配置 首先先配置 issuer-uri ,这里指向是授权服务器的地址 关于过滤器链的配置: 资源服务器将使用

    2024年02月12日
    浏览(23)
  • Spring Security—OAuth2 客户端认证和授权

    关于 JWT Bearer 客户端认证的进一步详情,请参考OAuth 2.0客户端认证和授权许可的 JSON Web Token (JWT)简介。 JWT Bearer 客户端认证的默认实现是  NimbusJwtClientAuthenticationParametersConverter ,它是一个  Converter ,通过在  client_assertion  参数中添加签名的JSON Web Token(JWS)来定制令牌请求

    2024年02月08日
    浏览(37)
  • Oauth2.0四种授权模式适用场景和授权流程介绍以及个人的一些思考

    Oauth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准,先前曾经了解过在 spring-security-oauth2 中 Oauth 四种模式的实现,也通过 Shiro 实现了 Oauth 的授权流程。 目前 spring-security-oauth2 已经被逐步废弃, Spring 也提供了新的框架 spring-authorization-server ,整个框架基于

    2024年02月03日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包