next.js 使用Kinde保护express API访问

kknvjkwl  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(105)

我正在使用next.js构建一个Web应用程序,并使用react native构建一个移动的应用程序。这两个应用程序都使用node.js和express作为后端。对于身份验证,我尝试使用Kinde(https://kinde.com/).虽然我设法在我的next.js应用程序中成功验证用户(还没有在react native中尝试过)并通过使用Kinde来保护我的后端API路由,我很难从next.js应用程序访问我受保护的API路由,尽管两者都使用Kinde。
我可以通过以下方式从Kinde获得accessToken(以及其他):

import {getKindeServerSession} from "@kinde-oss/kinde-auth-nextjs/server";
import Link from "next/link";

export default async function Home() {
  const {
    getAccessToken,
    getBooleanFlag,
    getFlag,
    getIntegerFlag,
    getOrganization,
    getPermission,
    getPermissions,
    getStringFlag,
    getUser,
    getUserOrganizations,
    isAuthenticated
  } = getKindeServerSession();

  [...]
}

字符串
但似乎上面的选项都不符合Kinde对Express服务器的期望。
也不通过“protectRoute”:

const { protectRoute } = require("@kinde-oss/kinde-node-express");    
   
app.get("/admin", protectRoute, (req, res) => {
   res.send("Welcome to the admin area");
});


也不通过“验证者”:

const {jwtVerify} = require("@kinde-oss/kinde-node-express");
const verifier = jwtVerify("https://<your_kinde_subdomain>.kinde.com");

app.get("/some-route", verifier, (req, res) => {
   console.log(req.user);
});


有人能描述一下如何访问受保护的路由吗?

wnavrhmk

wnavrhmk1#

gettoken函数的结果是token的反结构JSON对象,您不能使用此值或任何值直接发送到您的服务器进行身份验证。安全的方法是获取access_token的cookie值,并将其发送到需要身份验证的服务器路由的每个请求中。
在NextJS应用程序中,获取原始access_token cookie值,并将其设置为请求中的标头

const accessToken = cookies().get('access_token')?.value;
const requestHeaders = new Headers(request.headers);
requestHeaders.set("Authorization", `Bearer ${accessToken}`);

字符串
在您的服务器上,您可以使用

import {JwtRsaVerifier} from 'aws-jwt-verify';
const verifier = JwtRsaVerifier.create({
  issuer, // this is most likely https://xxx.kinde.com
  audience: audience || null,
  jwksUri: `${issuer}/.well-known/jwks.json`
});


并确保您的受众与启用管理API的NextJS环境变量(KINDE_AUDIENCE=https://xxx.kinde.com/api)中的受众相同。
现在,您可以在中间件中简单地执行此操作,获取NextJS发送的令牌并对其进行解析

try {
   const authHeader = req.headers.authorization;
   const token = authHeader && authHeader.split(' ')[1];

   const payload = await verifier.verify(token);
} catch {
   // error decoding token
}


payload将返回反结构化的JWT,您可以在其中检查反结构化的标记值

相关问题