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

2024-03-09 10:20

本文主要是介绍【安全】 阅读 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上写字,由于膜的原因,比较潦草)
    在这里插入图片描述

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 intotwo parts as they pass through the user-agent.Figure 3: Authorization Code Flow

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

在这里插入图片描述

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.1Host: server.example.com

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

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

在这里插入图片描述

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

授权令牌请求:POST /token HTTP/1.1Host: server.example.comAuthorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JWContent-Type: application/x-www-form-urlencodedgrant_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 OKContent-Type: application/json;charset=UTF-8Cache-Control: no-storePragma: no-cache{"access_token":"2YotnFZFEjr1zCsicMWpAA","token_type":"example","expires_in":3600,"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA","example_parameter":"example_value"}

在这里插入图片描述

4.4. access_token 续期

令牌续期:POST /token HTTP/1.1Host: server.example.comAuthorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JWContent-Type: application/x-www-form-urlencodedgrant_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不失为一种更好的实现,后续搞清楚了思想再写一篇单点登录的博客记录一下。

这篇关于【安全】 阅读 RFC6749 及理解 Oauth2.0 下的授权码模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/790378

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

客户案例:安全海外中继助力知名家电企业化解海外通邮困境

1、客户背景 广东格兰仕集团有限公司(以下简称“格兰仕”),成立于1978年,是中国家电行业的领军企业之一。作为全球最大的微波炉生产基地,格兰仕拥有多项国际领先的家电制造技术,连续多年位列中国家电出口前列。格兰仕不仅注重业务的全球拓展,更重视业务流程的高效与顺畅,以确保在国际舞台上的竞争力。 2、需求痛点 随着格兰仕全球化战略的深入实施,其海外业务快速增长,电子邮件成为了关键的沟通工具。

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民,网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席2024年国家网络安全宣传周开幕式和主论坛,并将通过线下宣讲、创意科普、成果展示等多种形式,让广大民众看得懂、记得住安全知识,同时还

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分