尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Payload JWT 认证:如何签发带 role 的 JWT 并校验请求身份

Payload JWT 认证:如何签发带 role 的 JWT 并校验请求身份 Payload JWT 认证如何签发带 role 的 JWT 并校验请求身份【免费下载链接】payloadPayload is the open-source, fullstack Next.js framework, giving you instant backend superpowers. Get a full TypeScript backend and admin panel instantly. Use Payload as a headless CMS or for building powerful applications.项目地址: https://gitcode.com/GitHub_Trending/pa/payloadPayload 的认证体系内置了 JWT 策略在启用认证的 Collection 上调用login、refresh、me等操作后会返回 token客户端把它放进后续请求的Authorization头Payload 就会把已认证用户挂到req.user上。如果你需要在 JWT 里携带role这类业务字段并让 Access Control / Hooks 在每次请求中据此判断权限需要做三件事在字段上标记saveToJWT、通过登录操作获取 token、在请求中携带 token 并由 Payload 校验后读取req.user.role。以下内容基于 JWT Strategy 文档、Token Data 文档 和 Authentication Operations 文档。准备启用认证并标记需要写入 JWT 的 role 字段在 Collection Config 中用auth属性开启认证详见 Authentication Overview。auth: true是默认行为适合大多数应用也可以传对象来配置tokenExpirationtoken 有效期单位秒、useSessions、removeTokenFromResponses等选项。要让role出现在 JWT 中在字段定义上设置saveToJWT: trueimport type { CollectionConfig } from payload export const Users: CollectionConfig { slug: users, auth: true, fields: [ { // will be stored in the JWT saveToJWT: true, type: select, name: role, options: [super-admin, user], }, ], }说明带saveToJWT: true的group字段会连同其内部字段整体存入 JWT内部单个字段也可以单独用saveToJWT: true/false控制是否包含见 Token Data。如果想用不同于字段name的键写入 JWT可以把saveToJWT写成一个字符串。tokenExpiration同时决定 JWT 与 HTTP-only cookie 的过期时间来自 Authentication Overview。开启认证后Payload 会自动注入hash、salt、email字段。签发 JWT调用 login 操作启用认证后Payload 会在 REST API 中自动暴露登录端点POST /api/[collection-slug]/login其中[collection-slug]是你的 Collection slug例如users。传入email和password成功后响应中返回user、token和exptoken 的 Unix 时间戳过期时间。以下是文档中的示例邮箱和密码需替换为你自己的账号const res await fetch(http://localhost:3000/api/users/login, { method: POST, headers: { Content-Type: application/json, }, body: JSON.stringify({ email: devpayloadcms.com, password: password, }), }) const json await res.json() // 文档示例响应 // { // user: { email, createdAt, updatedAt, id }, // token: 34o4345324..., // 用于认证用户的 JWT // exp: 1609619861 // token 过期的 Unix 时间戳 // }refresh-tokenPOST /api/[collection-slug]/refresh-token可以在 token 即将过期但用户仍活跃时换取新 token它要求当前 token 尚未过期已过期则只能重新登录。logout操作会安全地删除 tokenHTTP-only cookie 无法被浏览器 JavaScript 直接移除。校验请求身份在 Authorization 头携带 token除了 HTTP-only cookiePayload 支持通过Authorization头识别用户。把上一步拿到的 token 放进请求头const request await fetch(http://localhost:3000, { headers: { Authorization: JWT ${user.token}, }, })Payload 校验通过后会自动把用户对象挂到req.user你可以直接在 Access Control 函数和 Hooks 中读取 JWT 里的字段例如role来做权限判断import type { CollectionConfig } from payload export const Invoices: CollectionConfig { slug: invoices, access: { read: ({ req, data }) { if (!req?.user) return false if (req.user?.role super-admin) { return true } return data.owner req.user.id }, }, fields: [ { name: owner, relationTo: users, }, // ... other fields ], }Collection 级的access支持create、read、update、delete等按操作区分的函数认证 Collection 还有admin、unlock见 Collection Access Control。Access Control 函数在请求执行前运行返回false即拒绝操作read/update还可以返回 Query 约束来限定可见文档。验证确认 JWT 中确实携带了 roleme操作GET /api/[collection-slug]/me会返回当前登录用户及其 token文档说明响应中的user对象就是该用户 JWT 的 payload。登录后调用me检查返回的user对象中是否包含你配置了saveToJWT的role字段即可确认 role 已进入 JWT。文档示例响应{ user: { // The JWT payload ;) from the logged in user email: devpayloadcms.com, createdAt: 2020-12-27T21:16:45.645Z, updatedAt: 2021-01-02T18:37:41.588Z, id: 5ae8f9bde69e394e717c8832 }, token: 34o4345324..., exp: 1609619861, }如果你的 JWT 还要在 Payload 之外的服务中校验注意签名密钥不是原始密钥Payload 会对PAYLOAD_SECRET做 SHA-256 哈希并取前 32 个字符作为 JWT 操作使用的值见 External JWT Validationimport crypto from node:crypto const secret crypto .createHash(sha256) .update(process.env.PAYLOAD_SECRET) .digest(hex) .slice(0, 32)限制与边界若把removeTokenFromResponses设为true认证操作login、refresh 等的响应中不再返回 token适合只需要 cookie 认证的场景需要手动持有 JWT 时不要开启该选项。useSessions默认为true设为false后使用无状态的 JWT 认证而不是会话Authentication Overview。在 Local API 中Access Control 默认被跳过服务器拥有完全控制权如需启用可设置overrideAccess: false上述 Access Control 校验主要作用于 REST/GraphQL 请求路径。authCollection 会自动注入hash、salt、email字段自定义字段避免与之重名除非你是有意覆盖默认认证字段的行为。【免费下载链接】payloadPayload is the open-source, fullstack Next.js framework, giving you instant backend superpowers. Get a full TypeScript backend and admin panel instantly. Use Payload as a headless CMS or for building powerful applications.项目地址: https://gitcode.com/GitHub_Trending/pa/payload创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表