在NextJS中解密Directus静态Token的技术问题
问题解决思路
1. 先明确Directus静态Token的本质
Directus的静态Token不是JWT格式,就是一串随机生成的字符串凭证,所以用JWT解码工具肯定不管用——它不需要解密,只要拿到原始字符串就能直接用于API请求鉴权。
2. 解决NextAuth会话中Token加密的问题
你看到的******是NextAuth默认加密会话数据后的显示效果,要获取原始Token,按以下步骤处理:
第一步:检查NextAuth配置([...nextauth]/options.js)
确保在jwt和session回调里,正确把Directus静态Token存入会话:
export const options = { // 其他基础配置... session: { strategy: "jwt" }, // 优先用jwt策略,方便后续解密操作 callbacks: { async jwt({ token, user }) { // 登录成功时,把用户的Directus静态Token存入jwt对象 if (user) { token.directusToken = user.directusToken; // 假设登录逻辑中已获取到该Token token.userId = user.id; } return token; }, async session({ session, token }) { // 将Token同步到session,供服务端/前端读取 session.user.directusToken = token.directusToken; session.user.id = token.userId; return session; }, }, };
第二步:修改你的getUserInfo代码
- 修正
userMainToken的作用域问题(不要在if块内重复声明const) - 用NextAuth的
decode方法解密会话中的加密Token(如果session处于加密状态)
修改后的代码:
import { getServerSession } from "next-auth"; import { options } from "./[...nextauth]/options"; import { decode } from "next-auth/jwt"; export async function getUserInfo() { const session = await getServerSession(options); let userId = ''; let isAdmin = false; let isActiveSession = false; let isUserActive = false; let isUserRejected = false; let isUserBlocked = false; let accessToken = null; let userMainToken = null; if (session) { isActiveSession = true; // 用next-auth的decode方法解密会话中的token数据 const decodedToken = await decode({ token: session.user.directusToken, secret: options.secret // 必须和NextAuth配置里的secret完全一致 }); // 优先取解密后的Token,若直接存的明文则直接读取 userId = session.user.id; userMainToken = decodedToken?.directusToken || session.user.directusToken; } // 仅在拿到有效Token和userId时发起请求 let userContent = null; if (userMainToken && userId) { const res = await fetch(`*********/users/${userId}`, { method: 'GET', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${userMainToken}`, } }); const resTemp = await res.json(); userContent = resTemp.data; const adminID = 'e2895cd6-42e0-450f-9690-9b140572548e'; if (userContent?.role === adminID) { isAdmin = true; } if(userContent?.aktiver_nutzer) { isUserActive = true; } } return { userId, isAdmin, userContent, isActiveSession, isUserActive, accessToken }; }
3. 关键注意事项
- 登录逻辑中必须确保已从Directus获取到用户的静态Token,并传入NextAuth的
user对象 - NextAuth配置里的
secret必须和decode方法中传入的一致,否则无法解密 - 静态Token属于敏感凭证,尽量只在服务端使用(你的代码是服务端函数,符合安全要求)
内容的提问来源于stack exchange,提问作者n1k1dk
相关产品推荐
相关产品推荐

