前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >认证和授权的安全令牌 Bearer Token

认证和授权的安全令牌 Bearer Token

作者头像
Tinywan
发布2024-07-05 12:38:42
9270
发布2024-07-05 12:38:42
举报
文章被收录于专栏:开源技术小栈

概述

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 关键字开头,服务器就会提取出后面的令牌,并使用令牌来验证请求的合法性和授权级别,确认无误后提供请求的资源。

代码语言:javascript
复制
+-----------------------------+         +-----------------------------+
|                             |         |                             |
|         用户登录             |         |   服务器生成 Bearer Token    |
|                             |         |                             |
+-----------------------------+         +--------------+--------------+
             |                                         |
             v                                         v
+-----------------------------+         +--------------+--------------+
|                             |         |                             |
|                             |         |                             |
|        客户端发起请求        +--------->   Bearer Token 发送给客户端  |
|                             |         |                             |
|                             |         |                             |
+-----------------------------+         +--------------+--------------+
                                                       |
                                                       v
                                        +--------------+--------------+
                                        |                             |
                                        |                             |
                                        |     客户端发起请求并携带      |
                                        |       Bearer Token          |
                                        |                             |
                                        |                             |
                                        +--------------+--------------+
                                                       |
                                                       v
                                        +--------------+--------------+
                                        |                             |
                                        |                             |
                                        |     服务器接收请求并验证      |
                                        |         Bearer Token        |
                                        |                             |
                                        |                             |
                                        +--------------+--------------+
                                                       |
                                                       v
                                        +--------------+--------------+
                                        |                             |
                                        |                             |
                                        |  服务器返回资源给客户端       |
                                        |                             |
                                        |                             |
                                        +--------------+--------------+

使用示例

客户端请求授权

客户端向授权服务器发送请求,获取访问 Token。这个请求可能是这样的:

代码语言:javascript
复制
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_idclient_secret是客户端的凭证。

授权服务器颁发 Token

授权服务器验证客户端的凭证后,生成一个 Bearer Token 并返回给客户端:

代码语言:javascript
复制
{
  "access_token": "eyJhbGciOiJIUzI1NiIsxxxsw5c",
  "token_type": "bearer",
  "expires_in": 3600
}

在这个响应中,access_token是 Bearer Token,token_type表示令牌类型(此处为bearer),expires_in表示令牌的有效期(以秒为单位)。

客户端使用 Token 访问资源

客户端在每次请求受保护的资源时,将 Bearer Token 放在请求头中。例如,客户端想要访问api.example.com上的某个受保护的资源:

代码语言:javascript
复制
GET /api/resource HTTP/1.1
Host: api.example.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIsxxxsw5c

在这个请求中,Authorization头包含了Bearer关键字和 Bearer Token。

资源服务器验证 Token

资源服务器在收到请求后,会解析并验证 Bearer Token。如果 Token 有效且未过期,服务器会处理请求并返回相应的资源;如果 Token 无效或已过期,服务器会返回 401 未授权错误。

代码语言:javascript
复制
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 库为例

代码语言:javascript
复制
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 请求为例

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源技术小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 基本概念
  • 工作原理
  • 使用示例
    • 客户端请求授权
      • 授权服务器颁发 Token
        • 客户端使用 Token 访问资源
          • 资源服务器验证 Token
          • Bearer Token 优点
          • Bearer Token 安全
          • 前端如何使用
          相关产品与服务
          云服务器
          云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档