边缘计算框架HonoJs的权限控制

393 阅读4分钟

深入理解 Bearer Token 认证:简单、安全的应用方案

Bearer Token 是一种常见的身份验证方式,就像进入大厦需要通行证一样,客户端(比如你的手机App或者网页)在访问服务器资源时,需要提供一个“令牌”(Token)来证明自己的身份. 服务器验证这个令牌,如果确认有效,就允许客户端访问相应的资源.

Bearer Token 的工作原理

  1. 用户验证:用户使用用户名和密码等方式登录系统.
  2. 令牌生成:服务器验证用户身份后,会生成一个加密的 Token.
  3. 令牌发放:服务器将这个 Token 发送给客户端.
  4. 令牌存储:客户端将 Token 安全地存储起来,例如在浏览器的 LocalStorage 中.
  5. 请求资源:客户端每次需要访问服务器资源时,都会在 HTTP 请求头中携带这个 Token. 就像这样:Authorization: Bearer <你的令牌>
  6. 令牌验证:服务器收到请求后,会验证请求头中的 Token,如果验证通过,就允许客户端访问资源.

简单来说,Bearer Token 就像一张通行证,谁持有这张通行证,谁就可以访问相应的资源. "Bearer" 的意思就是“持有者”。

为什么选择 Bearer Token?

  • 更安全:相比传统的用户名和密码,Bearer Token 可以加密,并且可以设置有效期,降低了泄露风险.
  • 更方便:用户只需要登录一次,后续访问无需重复登录,提升用户体验.
  • 易集成:遵循 OAuth 2.0 标准,方便第三方服务接入.

如何在前端代码中添加 Bearer Token?

在前端,通常将 Bearer Token 放在 HTTP 请求的 Authorization 头部. 以下分别展示了使用 XMLHttpRequestVue (axios) 和 fetch 三种方式添加 Bearer Token 的示例:

1. XMLHttpRequest

var xhr = new XMLHttpRequest();
var url = "https://example.com/api/data";
xhr.open("GET", url, true);
xhr.setRequestHeader("Authorization", "Bearer your_token_here"); // 添加 Authorization 头
xhr.onreadystatechange = function () {
  if (xhr.readyState === 4 && xhr.status === 200) {
    var response = xhr.responseText;
    console.log(response);
  }
};
xhr.send();

2. Vue (使用 Axios)

import axios from 'axios';

const instance = axios.create({
  baseURL: 'https://example.com/api',
  timeout: 5000,
  headers: {
    'Content-Type': 'application/json'
  }
});

// 在请求头中设置 Bearer token
const token = 'your_token_here';
if (token) {
  instance.defaults.headers.common['Authorization'] = `Bearer ${token}`;
}

// 发送 GET 请求
instance.get('/data')
  .then(response => {
    console.log(response);
  })
  .catch(error => {
    console.log(error);
  });

3. Fetch API

const url = 'https://example.com/api/data';
const token = 'your_token_here';

fetch(url, {
  method: 'GET',
  headers: new Headers({
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${token}` // 添加 Authorization 头
  })
})
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error(error));

安全注意事项

  • 安全存储:避免将 Token 存储在不安全的地方,比如 Cookie 中,推荐使用 HTTPS 传输.
  • 有效期:设置 Token 的有效期,防止 Token 泄露后被长期滥用.
  • HTTPS:始终使用 HTTPS 加密传输数据,防止中间人攻击.
  • 定期更换:定期更换 Token,降低安全风险.

实际应用场景

  • API 接口认证:保护 API 接口,防止未授权访问.
  • 单点登录(SSO):用户在一个应用登录后,可以无缝访问其他关联应用.
  • 移动应用:App 访问服务器资源时,使用 Bearer Token 验证用户身份.

Hono 中的 Bearer Auth 中间件

Hono 是一个轻量级的 JavaScript Web 框架,它提供了一个 bearerAuth 中间件,可以方便地实现 Bearer Token 认证.

1. 安装

首先,你需要安装 honohono/bearer-auth

npm install hono hono/bearer-auth

2. 引入

在你的代码中引入需要的模块:

import { Hono } from 'hono'
import { bearerAuth } from 'hono/bearer-auth'

3. 使用

以下是一些使用示例:

  • 基本用法
const app = new Hono()
const token = 'honoiscool'

app.use('/api/*', bearerAuth({ token })) // 对 /api/ 下的所有路由进行认证

app.get('/api/page', (c) => {
  return c.json({ message: 'You are authorized' })
})
  • 限制特定路由和方法
const app = new Hono()
const token = 'honoiscool'

app.get('/api/page', (c) => {
  return c.json({ message: 'Read posts' })
})

app.post('/api/page', bearerAuth({ token }), (c) => { // 只对 POST 请求进行认证
  return c.json({ message: 'Created post!' }, 201)
})
  • 使用多个 Token
const app = new Hono()

const readToken = 'read'
const privilegedToken = 'read+write'
const privilegedMethods = ['POST', 'PUT', 'PATCH', 'DELETE']

app.on('GET', '/api/page/*', async (c, next) => {
  // 允许 readToken 和 privilegedToken 访问
  const bearer = bearerAuth({ token: [readToken, privilegedToken] })
  return bearer(c, next)
})

app.on(privilegedMethods, '/api/page/*', async (c, next) => {
  // 只允许 privilegedToken 访问
  const bearer = bearerAuth({ token: privilegedToken })
  return bearer(c, next)
})

// 定义 GET, POST 等方法的处理函数
  • 自定义 Token 验证
const app = new Hono()

app.use(
  '/auth-verify-token/*',
  bearerAuth({
    verifyToken: async (token, c) => {
      return token === 'dynamic-token' // 自定义验证逻辑
    },
  })
)

4. 配置选项

bearerAuth 中间件提供了一些配置选项,可以根据实际需求进行调整:

  • token:(必须) 用于验证的 Token 字符串或字符串数组.
  • realm: 可选,质询域,用于 WWW-Authenticate 头部.
  • prefix:可选,Authorization 头部的值的前缀,默认为 "Bearer".
  • headerName:可选,存放token的header的名字,默认为 "Authorization".
  • verifyToken:可选,自定义 Token 验证函数.
  • noAuthenticationHeaderMessage:可选,当请求头中缺少身份验证信息时的自定义消息.
  • invalidAuthenticationHeaderMessage:可选,当身份验证信息无效时的自定义消息.
  • invalidTokenMessage:可选,当 Token 无效时的自定义消息.

总结

Bearer Token 是一种简单而有效的身份验证方法,在各种应用场景中都有广泛的应用. 掌握 Bearer Token 的原理和使用方法,可以帮助我们构建更安全、更可靠的 Web 应用.