我如何在 nextjs 12 middlware 中获得下一个身份验证会话

mar*_*ruf 3 next.js

我正在尝试新的 nextjs 功能,在pages/_middleware.ts 中使用 next-auth 时,这似乎不起作用

import { getSession } from 'next-auth/client';
import type { NextFetchEvent, NextRequest } from 'next/server'
import {NextResponse} from 'next/server'
async function middleware(req: NextRequest, ev: NextFetchEvent) {
    let session = await getSession({ req });

      return new Response('Auth required', {
        status: 401,
        headers: {
          'WWW-Authenticate': 'Basic realm="Secure Area"',
        },
      })
}
export {middleware}
Run Code Online (Sandbox Code Playgroud)

这适用于 api 路由,但“req”对象是 NextApiRequest ,与这里不同。那么我如何获取中间件内的用户对象,以便我可以进行角色/身份验证检查。

Koj*_*udu 7

对我有用的是使用辅助函数getToken()并从令牌中解密会话信息,该令牌将与请求一起发送,即req参数

这是我的 _middleware.ts 的示例

export async function middleware(
  req: NextApiRequest,
  ev: NextFetchEvent
) {
  const token = await getToken({
    req,
    secret: process.env.SECRET,
  });
  console.log("from middleware ", token);
  return NextResponse.next();
}
Run Code Online (Sandbox Code Playgroud)

注意process.env.SECRET指的是您在jwt[...nextauth].ts配置中使用的秘密

  • 使用 req: NextRquest 时,Typescript 出现错误:类型“NextRequest”缺少类型“NextApiRequest”中的以下属性:query、env、aborted、httpVersion 和 46 more.ts(2740) jwt.d.ts(47, 3): 预期类型来自属性“req”,该属性在类型“GetTokenParams<false>”上声明 (3认同)