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

开发环境下在Strapi中自动生成API Token的方案咨询

解决方案:自动生成Strapi API Token并同步到Next.js环境变量

你的思路方向是对的,但直接操作数据库无法拿到可用的明文API Token(Strapi数据库中存储的是Token的哈希值),正确的方式是通过Strapi Admin API自动创建API Token,再将其写入Next.js的环境变量文件。以下是具体实现步骤:

方案一:用Node.js脚本自动完成全流程

这个脚本会先确保管理员用户存在(不存在则创建),然后登录获取管理员JWT,接着调用API生成API Token,最后写入Next.js的.env文件。

1. 编写脚本文件

创建两个脚本文件(也可合并为一个):

脚本1:管理员用户初始化/登录(strapi-admin-setup.js)

const axios = require('axios');
const strapiUrl = process.env.STRAPI_URL || 'http://localhost:1337';

async function getAdminJwt() {
  // 尝试登录现有管理员
  try {
    const loginRes = await axios.post(`${strapiUrl}/admin/login`, {
      email: process.env.STRAPI_ADMIN_EMAIL || 'admin@example.com',
      password: process.env.STRAPI_ADMIN_PASSWORD || 'Admin123!'
    });
    return loginRes.data.jwt;
  } catch (loginErr) {
    // 若管理员不存在,初始化创建
    if (loginErr.response?.data?.message === 'Invalid credentials') {
      try {
        const initRes = await axios.post(`${strapiUrl}/admin/init`, {
          email: process.env.STRAPI_ADMIN_EMAIL || 'admin@example.com',
          password: process.env.STRAPI_ADMIN_PASSWORD || 'Admin123!',
          firstname: 'Auto-Generated',
          lastname: 'Admin'
        });
        console.log('管理员用户创建成功');
        return initRes.data.jwt;
      } catch (initErr) {
        console.error('创建管理员失败:', initErr.response?.data || initErr.message);
        throw initErr;
      }
    } else {
      console.error('登录失败:', loginErr.response?.data || loginErr.message);
      throw loginErr;
    }
  }
}

module.exports = getAdminJwt;

脚本2:生成API Token并写入.env(strapi-generate-token.js)

const axios = require('axios');
const fs = require('fs');
const path = require('path');
const getAdminJwt = require('./strapi-admin-setup');

const strapiUrl = process.env.STRAPI_URL || 'http://localhost:1337';
const nextEnvPath = path.join(__dirname, '../next-app/.env.local'); // 替换为你的Next.js项目路径
const tokenConfig = {
  name: 'NextJS_Auto_Token',
  description: 'Auto-generated API Token for Next.js integration',
  type: 'read-only', // 生产环境建议用read-only,按需改为full-access
  permissions: [
    // 按需添加权限,比如读取所有内容类型
    { action: 'plugin::content-manager.explorer.read', subject: null },
    { action: 'api::post.post.read', subject: null },
    { action: 'api::category.category.read', subject: null }
  ],
  expiresAt: null // 永不过期,或者设置ISO格式日期如'2025-12-31T23:59:59Z'
};

async function generateApiToken() {
  const adminJwt = await getAdminJwt();
  if (!adminJwt) return;

  // 创建API Token
  try {
    const tokenRes = await axios.post(
      `${strapiUrl}/admin/api-tokens`,
      tokenConfig,
      { headers: { Authorization: `Bearer ${adminJwt}` } }
    );

    const apiToken = tokenRes.data.token;
    console.log('API Token生成成功:', apiToken);

    // 写入Next.js环境变量
    const envContent = `
NEXT_PUBLIC_STRAPI_API_URL=${strapiUrl}
STRAPI_API_TOKEN=${apiToken}
`;
    fs.writeFileSync(nextEnvPath, envContent.trim());
    console.log('已同步Token到Next.js环境变量文件');
  } catch (err) {
    console.error('生成API Token失败:', err.response?.data || err.message);
  }
}

generateApiToken();

2. 使用步骤

  1. 安装依赖:npm install axios
  2. 启动Strapi开发服务:strapi develop
  3. 运行脚本:node strapi-generate-token.js
    • 建议将管理员邮箱、密码、Strapi地址通过环境变量传入,避免硬编码:
      STRAPI_ADMIN_EMAIL=your-admin@example.com STRAPI_ADMIN_PASSWORD=YourStrongPass123! node strapi-generate-token.js
      

关键注意事项

  • 权限最小化:生产环境不要使用full-access类型的Token,只给Next.js需要的权限(比如仅读取内容的权限)。
  • 安全性:脚本中的管理员密码要保密,生产环境运行时确保Strapi Admin API仅允许可信IP访问。
  • 环境变量:Next.js中如果是客户端需要访问的变量,前缀用NEXT_PUBLIC_;仅服务器端用的变量无需前缀。

为什么不推荐直接操作数据库?

Strapi的API Token在创建时仅返回一次明文,数据库中存储的是哈希后的Token值,无法反向解密得到可用的明文Token,因此直接操作数据库无法实现你的需求,必须通过Admin API创建才能拿到可用的Token。

内容的提问来源于stack exchange,提问作者gozzy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:17:16