访问认证(三):Bearer

2024-03-20 17:38
文章标签 访问 认证 bearer

本文主要是介绍访问认证(三):Bearer,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Bearer 认证,也成为令牌认证,是一种 HTTP 身份验证方法。

原理

Bearer 认证的核心是 bearer token

bearer token 是一个加密字符串,通常由服务端根据密钥生成。

客户端在请求服务端时,必须在请求头中包含 Authorization: Bearer <token>

服务端收到请求后,解析出 <token> ,并校验 <token> 的合法性。

如果校验通过,则认证通过。

跟基本认证一样,Bearer 认证需要配合 HTTPS 一起使用,来保证认证安全性。

使用场景

通常用在 API 调度 场景。

基于 JWT 的 Token 认证机制

在典型的业务场景中,为了区分用户保证安全,必须对 API 请求进行认证,但是不能要求每个请求都进行登录操作。

合理的做法是:

1. 在第一次登录之后产生一个有一定有效期的 token ,并将它存储在浏览器的 Cookie 或者 LocalStorage 之中。

服务器会将这个 token 用文件、数据库 或者 缓存服务器等方法存下来,用于之后请求中的比对。

2. 之后的请求都携带这个 token,请求到达服务器端后,服务器端用这个 token 对请求进行认证。

或者可以采用更简单的方法

直接用密钥来签发 Token。

这样就可以省下额外的存储,也可以减少每一次请求时对数据库的查询压力。

这种方法已经有一种标准的实现方式,就是 JWT 。

JWT

简介

当前最流行的 token 编码方式是 JSON Web Token (JWT)。

JWT 是 Bearer Token 的一个具体实现,由 JSON 数据格式组成,通过 HASH 散列算法生成一个字符串。该字符串可以用来进行 授权 和 信息交换。

使用 JWT Token 进行认证有很多优点。比如:

(1)无需在服务端存储用户数据,可以减轻服务端压力;

(2)采用 JSON 数据格式,易读;

(3)跨语言、轻量级;

认证流程

1. 客户端使用 用户名 和 密码 请求登录。

2. 服务端收到请求后,会去验证用户名和密码。

        如果用户名和密码跟数据库记录不一致,则验证失败;

        如果一致则验证通过,服务端会签发一个 Token 返回给客户端。

3. 客户端收到请求后,将 Token 缓存起来,比如放在浏览器 Cookie 中或者 LocalStorage 中,之后每次请求都会携带该 Token。

4. 服务端收到请求后,会验证请求中的 Token,验证通过则进行业务逻辑处理,处理完后返回处理后的结果。

格式

JWT 由三部分组成,Header、Payload、Signature。它们之间用 圆点. 连接,并使用 Base64 编码。例如:

JhdWQiOiJpYW0uYXV0aHoubWFybW90ZWR1LmNvbSIsImV4cCI6MTYwNDE1ODk4NywiaWF0IjoxNjA0MTUxNzg3LCJpc3MiOiJpYW1jdGwiLCJuYmYiOjE2MDQxNTE3ODd9.d_2gj3vyEUlMq1b9A0tJoKdLvMInAEfQmdK7XZkB980

Header

Header 中包含三部分信息:

一是 Token 的类型

二是 Token 所使用的加密算法

三是 密钥ID(可选)

{"typ": "JWT","alg": "HS256"
}参数说明:
typ : Token 的类型是 JWT。
alg : Token 的加密算法,这里是 HS256(alg算法可以有多种)。

将 Header 进行 Base64 编码:

// 将 Header 进行 Base64 编码:
$ echo -n '{"typ":"JWT", "alg":"HS256"}' | base64
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

 在某些场景下,可能还会有 kid 选项,用于标识一个密钥ID

{"alg": "HS256","kid": "XhbY3aCrfjdYcP1OFJRu9xcno8JzSbUIvGE2","typ": "JWT"
}

Payload(载荷)

Payload 由三部分组成:

一是 JWT 标准中注册的声明(可选);

二是 公共的声明;

三是 私有的声明;

JWT 标准中注册的声明

字段名描述
iss (Issuer)JWT Token 的签发者,其值应为 大小写敏感的 字符串 或 Uri
sub (Subject)主题,sub 可以用来鉴别一个用户
exp (Expiration Time)JWT Token 过期时间
aud (Audience)

接收 JWT Token 的一方,

其值应为 大小写敏感的字符串 或 Uri,

一般可以为特定的App、服务、模块。

服务端的安全策略在签发时和验证时,aud 必须是一致的。

iat (Issued At)JWT Token 签发时间
nbf (Not Before)JWT Token 生效时间
jti (JWT ID)JWT Token ID,令牌的唯一标识符,通常用于一次性消费的Token
{"aud": "domain.com","exp": 1604158987,"iat": 1604151787,"iss": "iamctl","nbf": 1604151787
}// exp 值不要设置的太大,一般开发版本 2 小时,上线版本 7 天。
// 也可以根据需要自行设置。

将 Payload 进行 Base64 编码:

$ echo -n '{"aud":"domain.com","exp":1604158987,"iat":1604151787,"iss":"iamctl","nbf":1604151787}' | base64eyJhdWQiOiJkb21haW4uY29tIiwiZXhwIjoxNjA0MTU4OTg3LCJpYXQiOjE2MDQxNTE3ODcsImlz
cyI6ImlhbWN0bCIsIm5iZiI6MTYwNDE1MTc4N30=

公共的声明

可以添加任何的需要的信息。

一般添加用户的相关信息 或 其他业务需要的信息。

注意,不要添加敏感信息。

私有的声明

私有的声明 是 客户端 和 服务端 所共同定义的声明。

因为 Base64 是对称加解密的,所以不建议存放敏感信息。

Signature(签名)

Signature 是 Token 的签名部分。通过如下的方式生成:

(1)将 Header 和 Payload 分别 Base64 编码后,用 圆点. 连接;

(2)使用 Header 中声明的加密方式,利用 secretKey连接后的字符串进行加密。加密后的字符串即为最终的 Token。

secretKey 是密钥,保存在服务器中,一般通过配置文件来保存。

注意密钥一定不能泄露。密钥泄露后,入侵者可以使用该密钥来签发 JWT Token,从而入侵系统。

签名后,服务端会返回生成的 Token,客户端下次请求会携带该 Token。

服务端收到 Token 后会解析出 header.payload,然后用相同的 加密算法和密钥 对 header.payload 再进行一次加密,并对比加密后的 Token 和 收到的 Token 是否相同。

如果相同则验证通过,不相同则返回 HTTP 401 Unauthorized 的错误。

这篇关于访问认证(三):Bearer的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

java如何通过Kerberos认证方式连接hive

《java如何通过Kerberos认证方式连接hive》该文主要介绍了如何在数据源管理功能中适配不同数据源(如MySQL、PostgreSQL和Hive),特别是如何在SpringBoot3框架下通过... 目录Java实现Kerberos认证主要方法依赖示例续期连接hive遇到的问题分析解决方式扩展思考总

本地搭建DeepSeek-R1、WebUI的完整过程及访问

《本地搭建DeepSeek-R1、WebUI的完整过程及访问》:本文主要介绍本地搭建DeepSeek-R1、WebUI的完整过程及访问的相关资料,DeepSeek-R1是一个开源的人工智能平台,主... 目录背景       搭建准备基础概念搭建过程访问对话测试总结背景       最近几年,人工智能技术

Ollama整合open-webui的步骤及访问

《Ollama整合open-webui的步骤及访问》:本文主要介绍如何通过源码方式安装OpenWebUI,并详细说明了安装步骤、环境要求以及第一次使用时的账号注册和模型选择过程,需要的朋友可以参考... 目录安装环境要求步骤访问选择PjrIUE模型开始对话总结 安装官方安装地址:https://docs.

解读静态资源访问static-locations和static-path-pattern

《解读静态资源访问static-locations和static-path-pattern》本文主要介绍了SpringBoot中静态资源的配置和访问方式,包括静态资源的默认前缀、默认地址、目录结构、访... 目录静态资源访问static-locations和static-path-pattern静态资源配置

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

SpringBoot实现基于URL和IP的访问频率限制

《SpringBoot实现基于URL和IP的访问频率限制》在现代Web应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段,为了保护系统资源,需要对接口的访问频率进行限制,下面我们就来看看如何使用... 目录1. 引言2. 项目依赖3. 配置 Redis4. 创建拦截器5. 注册拦截器6. 创建控制器8.

SpringBoot如何访问jsp页面

《SpringBoot如何访问jsp页面》本文介绍了如何在SpringBoot项目中进行Web开发,包括创建项目、配置文件、添加依赖、控制层修改、测试效果以及在IDEA中进行配置的详细步骤... 目录SpringBoot如何访问JSP页python面简介实现步骤1. 首先创建的项目一定要是web项目2. 在