什么是JWT?OAuth2以及Bearer Token基本解析

本文深入解析JWT工作原理,对比session与cookie,探讨OAuth2中的JWT角色,并介绍BearerToken验证。焦点在于权限管理,适合理解基础token机制的开发者

最近在做关于不同权限用户对接口权限访问的校验程序,包括基于 Bearer token&&Password 的 OAuth2 校验方式以及 基于JWT tokens with Bearer 等校验方式,最近就会发这些校验程序的解析,所以这篇文章先作概念解读引入,以我能理解的说人话方式来解析概念。

本文的前提是对token,session,cookie的作用以及传输方式有一定的理解,当然之后我也会把写好的token,session,cookie的笔记发出来

JWT(json web token)

JWT是对token很多种加密构造的实现 方法/标准 之一

本质: 以json(J)形式的字符串,通过web传播(W)的一种token(T);默认base64算法

用户输入账号密码后,在服务器进行验证,如果无误的话,在服务器生成通过base64编码生成一个JWT Token(字符串),服务器把这个字符串传给客户端存储, 前端在每次请求时将JWT Token放入HTTP请求头中的Authorization属性中

JWT token的组成: base64(头部) + base64(负载) + base64(签名)

签名的构成

头部内指定签名算法(默认HS256) { Base64(头部) + “.” + Base64(负载) , 加密的服务端私钥}

在服务端接收到客户端发送过来的JWT token后的处理流程:

header(头部)和payload(负载)可以直接通过 指定算法+Base64 解码出原文

signature(加密的服务端私钥)无法解码出原文,其作用是校验token有没有被篡改。

服务端获取header中的加密算法之后,
用其加密{Base64(header)+"."+ Base64(payload),加密的已端私钥}
后来和传来的JWT比对校验token是否合格

token每次到服务器验证时,后端会把前两部分和secret再次生成签名,再和第三部分比对,无论改了哪个部分,校验都不会通过

jwt token与session-cookie对比

注意token相比session-cookie方式的优势在于 服务器端不需要存储token

只需在每次 web端请求token 在 服务端解码校验通过后 即时生成token返回供web端下次使用

session-cookie: 每次验证通过给你一份新证明材料(cookie)后自己还要保留一份副本(session)备用核对检查,我有几百万千万用户服务端就要保留几百千万的的副本材料

jwt token: 每次验证通过只需要给你新的一张证明材料,我不用保留什么百万千万材料核对,只需要你提供材料时稍微两个解码算法解码验证就行

OAuth2

OAuth2是一种授权框架,提供了一套详细的授权机制。用户或应用可以通过公开的或私有的设置,授权第三方应用访问特定资源;其使用场景一般为APP或者网页需要账密的授权验证和登录

OAuth2用程序代码实现步骤时,经常会把 JWT 作为一种认证机制使用。所以OAuth2和 JWT 经常一同提及,但这两者实质是不同属性完全不同的东西

OAuth2用在使用第三方账号登录的情况 (比如微博QQ网页或者APP登录)

JWT使用在前后端分离, 需要简单的对后台API进行保护时使用.

因为HTTP协议是开放的,可以任人调用。所以,如果接口不希望被随意调用,就需要做访问权限的控制,对访问用户校验后根据权限等级调用响应API

Bearer Token

Bearer Token验证属于HTTP协议标准验证,它随着OAuth协议而开始流行 官方文档https://tools.ietf.org/html/rfc6750#section-1.2

Bearer验证中的凭证称为BEARER_TOKEN,或者是access_token,它的颁发和验证完全由我们自己的应用程序来控制,而不依赖于系统和Web服务器Bearer认证,其核心便是BEARER_TOKEN,而最通用的Token编码方式便是:JSON WEB TOKEN

拥有 bearer token 的任何一方(被称为 “bearer”),可以以任何方式,来访问受 OAuth 2.0 保护的资源,

<think> 首先,用户的问题是:"我想查找使用OAuth2认证获取Bearer Token的方法 请问OAuth2认证获取Bearer Token的方法"。这是一个具体的查询,我需要基于提供的引用和之前的系统指令来回答。 回顾系统指令: - 所有行内数学表达式必须使用 `$...$` 格式。 - 独立公式使用 `$$...$$`。 - LaTeX 语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,如 `[^1]`。 用户提供了三个引用: - 引用[1]:讨论了 OAuth 2.0 流程中 Bearer Token 的颁发。 - 引用[2]:涉及 JWTOAuth2基本解析。 - 引用[3]:涵盖 Bearer TokenOAuth 2.0、OIDC、PKCE 等内容。 用户的问题是关于 OAuth2 认证获取 Bearer Token 的方法。我需要整合这些引用来提供一个清晰的解释。 关键点: - OAuth 2.0 是一种授权框架。 - Bearer Token 是一个访问令牌,用于访问保护资源。 - 获取 Bearer Token 的方法取决于 OAuth 2.0 的授权类型。 从引用[1]:"客户端首先通过某种方式(如授权码授权流程、资源所有者密码凭证授权等)向授权服务器请求一个访问令牌"。这列出了常见的授权类型: - 授权码授权流程 (Authorization Code Grant) - 资源所有者密码凭证授权 (Resource Owner Password Credentials Grant) - 还有其他类型,如客户端凭证授权 (Client Credentials Grant)、隐式授权 (Implicit Grant) 等。 引用[3]提到 OAuth 2.0 和 PKCE,这暗示了更现代的流程。 我需要描述获取 Bearer Token 的步骤和方法。结构应该: 1. **介绍 OAuth 2.0 和 Bearer Token**:简要解释什么是 OAuth 2.0 和 Bearer Token2. **获取方法**:详细说明不同的授权类型如何获取 Bearer Token。 3. **步骤**:提供一个通用的流程。 4. **举例**:可能用一个简单的示例。 5. **相关问题**:基于指令,生成相关问题。 回答必须使用中文。 添加引用标识:在回答中引用段落时,末尾添加如 `[^1]`。 生成相关问题:在回答末尾添加 "§§相关问题§§" 部分,列出几个相关问题。 从引用中提取: - [^1] 来自引用[1],讨论了 Bearer Token 的颁发。 - [^2] 来自引用[2],讨论了 JWTOAuth2。 - [^3] 来自引用[3],讨论了 OAuth 2.0 等。 我需要自然地融入引用。 结构化回答: - **开头**:直接回答问题。 - **主体**:解释 OAuth 2.0 授权类型如何获取 Bearer Token。 - **结尾**:总结。 常见的授权类型: 1. **授权码授权 (Authorization Code Grant)**:用于 Web 应用。用户被重定向到授权服务器登录,授权后返回授权码,客户端用授权码交换访问令牌。 2. **隐式授权 (Implicit Grant)**:用于单页应用或移动应用,直接返回访问令牌。 3. **资源所有者密码凭证授权 (Resource Owner Password Credentials Grant)**:用户直接提供用户名密码给客户端,客户端用此获取令牌。 4. **客户端凭证授权 (Client Credentials Grant)**:用于服务器服务器认证,客户端用自己的凭证获取令牌。 Bearer Token 通常是访问令牌本身。 步骤概述: - 客户端向授权服务器发出请求。 - 授权服务器验证请求并颁发访问令牌。 - 客户端使用该令牌访问资源服务器。 在回答中,避免使用数学公式,因为这与数学无关。但指令说所有行内数学表达式必须用 `$...$`,但这里没有数学。所以,确保如果有变量等使用 LaTeX 格式。 生成相关问题: 例如: 1. OAuth2 的不同授权类型有何区别? 2. 如何安全地使用 Bearer Token? 3. JWTOAuth2 中的应用是什么? 确保回答基于引用。 最终回答结构: - 解释获取方法。 - 引用相关部分。 - 生成相关问题。 开始草拟回答。 </think> ### OAuth2 认证获取 Bearer Token 的方法 OAuth 2.0 是一个授权框架,允许第三方应用(客户端)在用户授权后获取访问受保护资源的权限。Bearer TokenOAuth 2.0 中的一种访问令牌(Access Token),它作为“持有者凭证”(Bearer Credential)使用:任何持有该令牌的实体都可以访问相关资源,无需进一步验证身份[^1]。获取 Bearer Token 的核心是通过 OAuth 2.0 的授权流程,其中客户端向授权服务器发送请求,授权服务器在验证用户同意后颁发令牌。具体方法取决于 OAuth 2.0 的授权类型(Grant Type),以下是常见的几种获取方式。 #### 主要授权类型和获取步骤 1. **授权码授权流程(Authorization Code Grant)** 这是最安全的授权类型,适用于 Web 应用和后端服务。流程包括: - 客户端将用户重定向到授权服务器的登录页面(包含客户端 ID、重定向 URI 和 scope 等参数)。 - 用户登录并同意授权后,授权服务器返回一个授权码(Authorization Code)到客户端指定的重定向 URI。 - 客户端使用该授权码向授权服务器请求访问令牌:发送 POST 请求,包含客户端凭证(如 ID 和 secret)、授权码和重定向 URI。 - 授权服务器验证请求,如果成功,返回 Bearer Token(通常包含访问令牌、令牌类型为 "Bearer"、有效期等)[^1]。 例如: ```http POST /token HTTP/1.1 Host: auth-server.example.com Content-Type: application/x-www-form-urlencoded grant_type=authorization_code&code=SplxlOBe...&redirect_uri=https%3A%2F%2Fclient.example.com%2Fcallback&client_id=s6BhdRkqt3&client_secret=7Fjfp0ZBr1KtDRbnfVdmIw ``` 2. **资源所有者密码凭证授权(Resource Owner Password Credentials Grant)** 该方法适用于可信客户端(如内部应用),用户直接向客户端提供用户名和密码。流程包括: - 客户端收集用户的用户名和密码。 - 客户端向授权服务器发送 POST 请求,包含用户名、密码、客户端 ID 和 secret,以及 grant_type 为 "password"。 - 授权服务器验证用户凭证和客户端权限,如果有效,直接颁发 Bearer Token[^1]。 例如: ```http POST /token HTTP/1.1 Host: auth-server.example.com Content-Type: application/x-www-form-urlencoded grant_type=password&username=johndoe&password=A3ddj3w&client_id=s6BhdRkqt3&client_secret=7Fjfp0ZBr1KtDRbnfVdmIw ``` 3. **隐式授权流程(Implicit Grant)** 适用于单页应用(SPA)或移动应用,其中简化了流程以提高效率(但安全性较低)。流程包括: - 客户端通过浏览器重定向用户到授权服务器。 - 用户同意后,授权服务器直接将 Bearer Token 附加到重定向 URI 的片段部分(如 URL hash),客户端从中提取令牌(省略了授权码交换步骤)[^1]。 4. **客户端凭证授权(Client Credentials Grant)** 用于服务器服务器通信(无用户参与)。流程包括: - 客户端使用自己的凭证(客户端 ID 和 secret)向授权服务器发送 POST 请求,设置 grant_type 为 "client_credentials"。 - 授权服务器验证客户端身份,颁发 Bearer Token 允许访问客户端自己的资源[^2]。 #### 通用步骤总结 获取 Bearer Token 的通用流程如下: 1. **初始化请求**:客户端选择适当的授权类型,并向授权服务器发送请求(参数包括客户端 ID、secret、scope 和 grant_type)。 2. **用户授权**:对于涉及用户的类型(如授权码或密码授权),用户必须在授权服务器上登录并同意权限。 3. **令牌颁发**:授权服务器验证请求后,响应一个 JSON 对象,包含 Bearer Token(访问令牌)、令牌类型(通常为 "Bearer")、有效期(expires_in)和刷新令牌(refresh_token,可选)。 4. **使用令牌**:客户端在后续请求中,将 Bearer Token 放入 HTTP 头(如 `Authorization: Bearer <token>`)访问资源服务器[^1][^3]。 注意:Bearer Token 的安全性至关重要,应通过 HTTPS 传输,并避免在不安全环境存储。此外,现代实现中,Bearer Token 可能采用 JWT(JSON Web Token)格式,包含加密的声明信息(claims),以增强验证能力[^2][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值