Bearer 令牌认证
Bearer 插件启用使用 Bearer 令牌作为浏览器 Cookie 的替代方案进行认证。它会拦截请求,在转发到您的 API 之前,将 Bearer 令牌添加到 Authorization 标头中。
请谨慎使用;此功能仅适用于不支持 Cookie 或需要 Bearer 令牌进行认证的 API。不当实现很容易导致安全漏洞。
安装 Bearer 插件
将 Bearer 插件添加到您的认证设置中:
import { betterAuth } from "better-auth";
import { bearer } from "better-auth/plugins";
export const auth = betterAuth({
plugins: [bearer()]
});如何使用 Bearer 令牌
1. 获取 Bearer 令牌
成功登录后,您将在响应头中收到一个会话令牌。请安全存储此令牌(例如,在 localStorage 中):
const { data } = await authClient.signIn.email({
email: "user@example.com",
password: "securepassword"
}, {
onSuccess: (ctx)=>{
const authToken = ctx.response.headers.get("set-auth-token") // 从响应头中获取令牌
// 安全存储令牌(例如,在 localStorage 中)
localStorage.setItem("bearer_token", authToken);
}
});您也可以在您的认证客户端中全局设置此功能:
export const authClient = createAuthClient({
fetchOptions: {
onSuccess: (ctx) => {
const authToken = ctx.response.headers.get("set-auth-token") // 从响应头中获取令牌
// 安全存储令牌(例如,在 localStorage 中)
if(authToken){
localStorage.setItem("bearer_token", authToken);
}
}
}
});您可能希望根据响应状态码或其他条件清除令牌:
2. 配置认证客户端
设置您的认证客户端,以便在所有请求中包含 Bearer 令牌:
export const authClient = createAuthClient({
fetchOptions: {
auth: {
type:"Bearer",
token: () => localStorage.getItem("bearer_token") || "" // 从 localStorage 中获取令牌
}
}
});3. 发出认证请求
现在您可以发出认证的 API 调用:
// 此请求会自动进行认证
const { data } = await authClient.listSessions();4. 每个请求的令牌(可选)
您也可以为单个请求提供令牌:
const { data } = await authClient.listSessions({
fetchOptions: {
headers: {
Authorization: `Bearer ${token}`
}
}
});5. 在认证客户端外部使用 Bearer 令牌
Bearer 令牌可用于认证对您的 API 的任何请求,即使不使用认证客户端:
const token = localStorage.getItem("bearer_token");
const response = await fetch("https://api.example.com/data", {
headers: {
Authorization: `Bearer ${token}`
}
});
const data = await response.json();而在服务器端,您可以使用 auth.api.getSession 函数来认证请求:
import { auth } from "@/auth";
export async function handler(req, res) {
const session = await auth.api.getSession({
headers: req.headers
});
if (!session) {
return res.status(401).json({ error: "Unauthorized" });
}
// 处理认证请求
// ...
}选项
requireSignature (boolean): 要求令牌必须签名。默认值:false。