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
相关产品推荐
相关产品推荐

