## 概述
Bearer Token 是一种用于身份验证的访问令牌,它授权持有者(Bearer)访问资源的权限。当你向服务器发送请求时,你可以在请求头中携带`Bearer Token`,服务器会根据这个 Token 来验证你的身份并授权你所请求的操作。
它通常用于 OAuth 2.0 认证框架中,用来验证访问者的身份并授予其相应的权限。Bearer Token 是一种加密的字符串,客户端在每次请求时将其附加到 HTTP 请求头中,从而使服务器能够识别并授权该请求。
## 基本概念
Bearer Token 是一种无状态的、短期的、可撤销的凭证,它被设计用来在客户端与服务器之间传递身份验证信息。所谓无状态,意味着服务器不需要保存任何关于 Bearer Token 的会话信息,只需要在收到请求时验证该 Token 的有效性。这样做的好处是减少了服务器的负担,提升了系统的扩展性。
Bearer Token 通常是由身份提供者(Identity Provider, IdP)生成的,这些身份提供者可以是 OAuth 2.0 的授权服务器。客户端通过特定的授权流程(如授权码流程、密码凭证流程等)获取 Bearer Token,之后便可在调用受保护资源时使用该 Token。
## 工作原理
当用户成功登录后,服务器会生成一个`Bearer Token`并返回给客户端,客户端随后在发起请求时,会在 HTTP 头部包含这个 Token。
`Bearer Token`在请求头中以 Bearer 关键字加上令牌本身的形式发送,格式通常为`Authorization: Bearer <token>`。服务器接收到请求后,会检查请求头中的 Authorization 字段,如果它以 Bearer 关键字开头,服务器就会提取出后面的令牌,并使用令牌来验证请求的合法性和授权级别,确认无误后提供请求的资源。
~~~
+-----------------------------+ +-----------------------------+
| | | |
| 用户登录 | | 服务器生成 Bearer Token |
| | | |
+-----------------------------+ +--------------+--------------+
| |
v v
+-----------------------------+ +--------------+--------------+
| | | |
| | | |
| 客户端发起请求 +---------> Bearer Token 发送给客户端 |
| | | |
| | | |
+-----------------------------+ +--------------+--------------+
|
v
+--------------+--------------+
| |
| |
| 客户端发起请求并携带 |
| Bearer Token |
| |
| |
+--------------+--------------+
|
v
+--------------+--------------+
| |
| |
| 服务器接收请求并验证 |
| Bearer Token |
| |
| |
+--------------+--------------+
|
v
+--------------+--------------+
| |
| |
| 服务器返回资源给客户端 |
| |
| |
+--------------+--------------+
~~~
## 使用示例
### 客户端请求授权
客户端向授权服务器发送请求,获取访问 Token。这个请求可能是这样的:
```
POST /oauth/token HTTP/1.1
Host: auth.example.com
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials&client_id=your_client_id&client_secret=your_client_secret
```
在这个请求中,`grant_type`表示授权类型,`client_id`和`client_secret`是客户端的凭证。
### 授权服务器颁发 Token
授权服务器验证客户端的凭证后,生成一个 Bearer Token 并返回给客户端:
```json
{
"access_token": "eyJhbGciOiJIUzI1NiIsxxxsw5c",
"token_type": "bearer",
"expires_in": 3600
}
```
在这个响应中,`access_token`是 Bearer Token,`token_type`表示令牌类型(此处为`bearer`),`expires_in`表示令牌的有效期(以秒为单位)。
### 客户端使用 Token 访问资源
客户端在每次请求受保护的资源时,将 Bearer Token 放在请求头中。例如,客户端想要访问`api.example.com`上的某个受保护的资源:
```json
GET /api/resource HTTP/1.1
Host: api.example.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIsxxxsw5c
```
在这个请求中,`Authorization`头包含了`Bearer`关键字和 Bearer Token。
### 资源服务器验证 Token
资源服务器在收到请求后,会解析并验证 Bearer Token。如果 Token 有效且未过期,服务器会处理请求并返回相应的资源;如果 Token 无效或已过期,服务器会返回 401 未授权错误。
```
HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8
{
"code": 0,
"msg": "唯一凭证密钥格错误",
"data": {}
}
```
### Bearer Token 的优点
> Bearer Token 作为一种认证机制,有许多优点:
1. **简单易用**:Bearer Token 通过 HTTP 请求头进行传输,使用起来非常简单,不需要复杂的会话管理。
2. **无状态**:Bearer Token 是无状态的,服务器不需要存储会话信息,减少了服务器的负担,提高了系统的扩展性。
3. **灵活**:Bearer Token 可以在不同的客户端和服务器之间传递,适用于多种场景和平台。
4. **安全性**:通过使用 HTTPS 传输,Bearer Token 的安全性得到了保障。同时,Token 本身可以包含加密的信息,进一步提升了安全性。
### Bearer Token 的安全考虑
> 尽管 Bearer Token 有许多优点,但在实际应用中仍需注意其安全性。以下是一些关键的安全考虑:
1. **使用 HTTPS**:Bearer Token 必须通过 HTTPS 传输,以防止 Token 在传输过程中被窃取。
2. **短期有效性**:Bearer Token 通常设置为短期有效,以减少 Token 被盗后的风险。可以结合刷新 Token 机制来延长用户会话。
3. **限制 Token 权限**:Bearer Token 应该尽可能限制其权限,只授予客户端所需的最小权限。
4. **监控和撤销 Token**:服务器应监控 Bearer Token 的使用情况,发现异常行为时应立即撤销相应的 Token。
5. **保护 Token 存储**:客户端应妥善保护存储 Bearer Token 的位置,防止 Token 被恶意软件或其他攻击者窃取。
## 前端如何使用
在发送请求时,将其携带在请求头(Header)的 `Authorization` 字段中,其字段值为 `Bearer` 关键字加上令牌本身。
> 以下以 JavaScript 的 Axios 库为例
~~~
const axios = require('axios')
const url = 'https://api.example.com/data' // 替换为你要访问的 API 地址
const token = 'your_bearer_token' // 替换为你的 Bearer Token
axios
.get(url, {
headers: {
Authorization: 'Bearer ' + token,
},
})
.then(function (response) {
console.log('请求成功:', response.data)
})
.catch(function (error) {
console.error('请求失败:', error)
})
~~~
> 以下以 Postman 请求为例
![](https://img.kancloud.cn/00/13/001398f87d895033d3cf679000a7b21a_1142x245.png)
- 设计模式系列
- 工厂方法模式
- 序言
- Windows程序注册为服务的工具WinSW
- 基础
- 安装
- 开发规范
- 目录结构
- 配置
- 快速入门
- 架构
- 请求流程
- 架构总览
- URL访问
- 容器和依赖注入
- 中间件
- 事件
- 代码层结构
- 四个层次
- 路由
- 控制器
- 请求
- 响应
- 数据库
- MySQL实时同步数据到ES解决方案
- 阿里云DTS数据MySQL同步至Elasticsearch实战
- PHP中的MySQL连接池
- PHP异步非阻塞MySQL客户端连接池
- 模型
- 视图
- 注解
- @SpringBootApplication(exclude={DataSourceAutoConfiguration.calss})
- @EnableFeignClients(basePackages = "com.wotu.feign")
- @EnableAspectJAutoProxy
- @EnableDiscoveryClient
- 错误和日志
- 异常处理
- 日志处理
- 调试
- 验证
- 验证器
- 验证规则
- 扩展库
- 附录
- Spring框架知识体系详解
- Maven
- Maven和Composer
- 构建Maven项目
- 实操课程
- 01.初识SpringBoot
- 第1章 Java Web发展史与学习Java的方法
- 第2章 环境与常见问题踩坑
- 第3章 springboot的路由与控制器
- 02.Java编程思想深度理论知识
- 第1章 Java编程思想总体
- 第2章 英雄联盟的小案例理解Java中最为抽象的概念
- 第3章 彻底理解IOC、DI与DIP
- 03.Spring与SpringBoot理论篇
- 第1章 Spring与SpringBoot导学
- 第2章 Spring IOC的核心机制:实例化与注入
- 第3章 SpringBoot基本配置原理
- 04.SprinBoot的条件注解与配置
- 第1章 conditonal 条件注解
- 第2章 SpringBoot自动装配解析
- 05.Java异常深度剖析
- 第1章 Java异常分类剖析与自定义异常
- 第2章 自动配置Url前缀
- 06.参数校验机制与LomBok工具集的使用
- 第1章 LomBok工具集的使用
- 第2章 参数校验机制以及自定义校验
- 07.项目分层设计与JPA技术
- 第1章 项目分层原则与层与层的松耦合原则
- 第2章 数据库设计、实体关系与查询方案探讨
- 第3章 JPA的关联关系与规则查询
- 08.ORM的概念与思维
- 第1章 ORM的概念与思维
- 第2章 Banner等相关业务
- 第3章 再谈数据库设计技巧与VO层对象的技巧
- 09.JPA的多种查询规则
- 第1章 DozerBeanMapper的使用
- 第2章 详解SKU的规格设计
- 第3章 通用泛型Converter
- 10.令牌与权限
- 第1章 通用泛型类与java泛型的思考
- 常见问题
- 微服务
- demo
- PHP中Self、Static和parent的区别
- Swoole-Cli
- 为什么要使用现代化PHP框架?
- 公众号
- 一键部署微信公众号Markdown编辑器(支持适配和主题设计)
- Autodesigner 2.0发布
- Luya 一个现代化PHP开发框架
- PHPZip - 创建、读取和管理 ZIP 文件的简单库
- 吊打Golang的PHP界天花板webman压测对比
- 简洁而强大的 YAML 解析库
- 推荐一个革命性的PHP测试框架:Kahlan
- ServBay下一代Web开发环境
- 基于Websocket和Canvas实现多人协作实时共享白板
- Apipost预执行脚本如何调用外部PHP语言
- 认证和授权的安全令牌 Bearer Token
- Laradock PHP 的 Docker 完整本地开发环境
- 高效接口防抖策略,确保数据安全,避免重复提交的终极解决方案!
- TIOBE 6月榜单:PHP稳步前行,编程语言生态的微妙变化
- Aho-Corasick字符串匹配算法的实现
- Redis键空间通知 Keyspace Notification 事件订阅
- ServBay如何启用并运行Webman项目
- 使用mpdf实现导出pdf文件功能
- Medoo 轻量级PHP数据库框架
- 在PHP中编写和运行单元测试
- 9 PHP运行时基准性能测试
- QR码生成器在PHP中的源代码
- 使用Gogs极易搭建的自助Git服务
- Gitea
- webman如何记录SQL到日志?
- Sentry PHP: 实时监测并处理PHP应用程序中的错误
- Swoole v6 Alpha 版本已发布
- Proxypin
- Rust实现的Redis内存数据库发布
- PHP 8.4.0 Alpha 1 测试版本发布
- 121
- Golang + Vue 开发的开源轻量 Linux 服务器运维管理面板
- 内网穿透 FRP VS Tailscale
- 新一代开源代码托管平台Gitea
- 微服务系列
- Nacos云原生配置中心介绍与使用
- 轻量级的开源高性能事件库libevent
- 国密算法
- 国密算法(商用密码)
- GmSSL 支持国密SM2/SM3/SM4/SM9/SSL 密码工具箱
- GmSSL PHP 使用
- 数据库
- SQLite数据库的Web管理工具
- 阿里巴巴MySQL数据库强制规范
- PHP
- PHP安全测试秘密武器 PHPGGC
- 使用declare(strict_types=1)来获得更健壮的PHP代码
- PHP中的魔术常量
- OSS 直传阿里腾讯示例
- PHP源码编译安装APCu扩展实现数据缓存
- BI性能DuckDB数据管理系统
- 为什么别人可以是架构师!而我却不是?
- 密码还在用 MD5 加盐?不如试试 password_hash
- Elasticsearch 在电商领域的应用与实践
- Cron 定时任务入门
- 如何动态设置定时任务!而不是写死在Linux Crontab
- Elasticsearch的四种查询方式,你知道多少?
- Meilisearch vs Elasticsearch
- OpenSearch vs Elasticsearch
- Emlog 轻量级开源博客及建站系统
- 现代化PHP原生协程引擎 PRipple
- 使用Zephir编写C扩展将PHP源代码编译加密
- 如何将PHP源代码编译加密,同时保证代码能正常的运行
- 为什么选择Zephir给PHP编写动态扩展库?
- 使用 PHP + XlsWriter实现百万级数据导入导出
- Rust编写PHP扩展
- 阿里云盘开放平台对接进行文件同步
- 如何构建自己的PHP静态可执行文件
- IM后端架构
- RESTful设计方法和规范
- PHP编译器BPC 7.3 发布,成功编译ThinkPHP8
- 高性能的配置管理扩展 Yaconf
- PHP实现雪花算法库 Snowflake
- PHP官方现代化核心加密库Sodium
- pie
- 现代化、精简、非阻塞PHP标准库PSL
- PHP泛型和集合
- 手把手教你正确使用 Composer包管理
- JWT双令牌认证实现无感Token自动续期
- 最先进PHP大模型深度学习库TransformersPHP
- PHP如何启用 FFI 扩展
- PHP超集语言PXP
- 低延迟双向实时事件通信 Socket.IO
- PHP OOP中的继承和多态
- 强大的现代PHP高级调试工具Kint
- PHP基金会
- 基于webman+vue3高质量中后台框架SaiAdmin
- 开源免费的定时任务管理系统:Gocron
- 简单强大OCR工具EasyOCR在PHP中使用
- PHP代码抽象语法树工具PHP AST Viewer
- MySQL数据库管理工具PHPMyAdmin
- Rust编写的一款高性能多人代码编辑器Zed
- 超高性能PHP框架Workerman v5.0.0-beta.8 发布
- 高并发系列
- 入门介绍及安装
- Lua脚本开发 Hello World
- 执行流程与阶段详解
- Nginx Lua API 接口开发
- Lua模块开发
- OpenResty 高性能的正式原因
- 记一次查找 lua-resty-mysql 库 insert_id 的 bug
- 包管理工具OPM和LuaRocks使用
- 异步非阻塞HTTP客户端库 lua-resty-http
- Nginx 内置绑定变量
- Redis协程网络库 lua-resty-redis
- 动态HTML渲染库 lua-testy-template
- 单独的
- StackBlitz在线开发环境
- AI
- 基础概念
- 12312
- 基础镜像的坑
- 利用phpy实现 PHP 编写 Vision Transformer (ViT) 模型
- 语义化版本 2.0.0