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

Deno Edge Function中用djwt验证Supabase JWT时出现读取'name'未定义错误

问题

在Deno Edge Function中使用djwt验证Supabase的supabase.auth.signInWithPassword()签发的JWT时,遇到以下错误:

TypeError: Cannot read properties of undefined (reading 'name')
at verify (https://deno.land/x/djwt@v3.0.1/algorithm.ts:21:22)
at verify (https://deno.land/x/djwt@v3.0.1/mod.ts:91:7)

源代码(functions/isAdmin/index.ts):

// functions/isAdmin/index.ts
// @ts-ignore
import { serve } from "https://deno.land/std/http/server.ts";
// @ts-ignore
import { createClient } from "https://esm.sh/@supabase/supabase-js";
// @ts-ignore
import { verify } from "https://deno.land/x/djwt@v2.9.1/mod.ts";

// Supabase Client Setup
// @ts-ignore
const supabaseUrl = Deno.env.get("SUPABASE_URL")!;
// @ts-ignore
const supabaseKey = Deno.env.get("SUPABASE_SERVICE_ROLE_KEY")!;
const supabase = createClient(supabaseUrl, supabaseKey);

// JWT Secret (from Supabase JWT_SECRET)
const JWT_SECRET = new TextEncoder().encode(Deno.env.get("JWT_SECRET"));

serve(async (req) => {
  try {
    //Extract Token from Authorization Header
    const authHeader = req.headers.get("Authorization");
    if (!authHeader?.startsWith("Bearer ")) {
      return new Response(JSON.stringify({ isAdmin: false, error: "No token provided" }), {
        status: 401,
        headers: { "Content-Type": "application/json" },
      });
    }

    const token = authHeader.split(" ")[1];
    console.log("Token:", token);

    // Verify the JWT Signature using `verify()` (HS256)
    try {
      await verify(token, JWT_SECRET, "HS256");
    } catch (err) {
      console.error("Signature Error:", err);
      return new Response(
        JSON.stringify({ isAdmin: false, error: "Invalid token signature" }),
        { status: 403, headers: { "Content-Type": "application/json" } }
      );
    }

    return new Response(
      JSON.stringify({
        isAdmin: true,
      }),
      {
        status: 200,
        headers: { "Content-Type": "application/json" },
      }
    );
  } catch (error) {
    return new Response(
      JSON.stringify({ isAdmin: false, error: error.message }),
      {
        status: 500,
        headers: { "Content-Type": "application/json" },
      }
    );
  }
});

已尝试的方案:

  • 从djwt@v3.0.1切换到v2.9.1,错误依旧;
  • 确认SUPABASE_JWT_SECRET正确,与Supabase后台API中的JWT Secret一致;
  • 在jwt.io上验证token,HS256签名有效;
  • decode()方法可正常工作,仅verify()失败。
解决方案

1. 修正djwt算法参数传递方式

djwt v2.x版本的verify函数不接受字符串格式的算法名称,需要传入对应的算法对象。修改导入语句,同时引入HS256算法:

import { verify, HS256 } from "https://deno.land/x/djwt@v2.9.1/mod.ts";

然后调整verify调用的参数,传入HS256对象而非字符串:

await verify(token, JWT_SECRET, HS256);

2. 确保JWT_SECRET正确初始化

检查环境变量名称是否匹配:Supabase的JWT Secret对应的环境变量通常是SUPABASE_JWT_SECRET,而非JWT_SECRET。修正变量获取逻辑,同时添加空值检查避免undefined:

const jwtSecretRaw = Deno.env.get("SUPABASE_JWT_SECRET");
if (!jwtSecretRaw) {
  throw new Error("SUPABASE_JWT_SECRET environment variable not set");
}
const JWT_SECRET = new TextEncoder().encode(jwtSecretRaw);

3. 完整修正后的代码

// functions/isAdmin/index.ts
import { serve } from "https://deno.land/std/http/server.ts";
import { createClient } from "https://esm.sh/@supabase/supabase-js";
import { verify, HS256 } from "https://deno.land/x/djwt@v2.9.1/mod.ts";

// Supabase Client Setup
const supabaseUrl = Deno.env.get("SUPABASE_URL")!;
const supabaseKey = Deno.env.get("SUPABASE_SERVICE_ROLE_KEY")!;
const supabase = createClient(supabaseUrl, supabaseKey);

// JWT Secret (from Supabase SUPABASE_JWT_SECRET)
const jwtSecretRaw = Deno.env.get("SUPABASE_JWT_SECRET");
if (!jwtSecretRaw) {
  throw new Error("SUPABASE_JWT_SECRET environment variable not set");
}
const JWT_SECRET = new TextEncoder().encode(jwtSecretRaw);

serve(async (req) => {
  try {
    // Extract Token from Authorization Header
    const authHeader = req.headers.get("Authorization");
    if (!authHeader?.startsWith("Bearer ")) {
      return new Response(JSON.stringify({ isAdmin: false, error: "No token provided" }), {
        status: 401,
        headers: { "Content-Type": "application/json" },
      });
    }

    const token = authHeader.split(" ")[1];
    console.log("Token:", token);

    // Verify the JWT Signature using HS256 algorithm
    try {
      await verify(token, JWT_SECRET, HS256);
    } catch (err) {
      console.error("Signature Error:", err);
      return new Response(
        JSON.stringify({ isAdmin: false, error: "Invalid token signature" }),
        { status: 403, headers: { "Content-Type": "application/json" } }
      );
    }

    return new Response(
      JSON.stringify({ isAdmin: true }),
      { status: 200, headers: { "Content-Type": "application/json" } }
    );
  } catch (error) {
    return new Response(
      JSON.stringify({ isAdmin: false, error: error.message }),
      { status: 500, headers: { "Content-Type": "application/json" } }
    );
  }
});

原因说明

错误Cannot read properties of undefined (reading 'name')是因为djwt内部尝试读取算法对象的name属性,但你传入的是字符串"HS256",导致算法参数为undefined,触发了类型错误。使用djwt提供的HS256算法对象即可解决此问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 07:17:08