You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 09:13:18