在NextJS和新的应用程序路由器中使用Iron-Session

rkkpypqq  于 2023-08-04  发布在  其他
关注(0)|答案(1)|浏览(212)

请原谅我的无知...我没有100%掌握会话cookie和身份验证,这就是为什么我正在构建一些东西...了解,然后做得更好...
无论如何,我正在尝试在我的nextJS应用程序上使用session cookie,并且我正在从iron session中移植示例代码......然而,iron session的示例使用了pages router,我没有在我的应用程序中使用它。
例如,以下是来自iron sessions示例的登录路径:

import { Octokit } from "octokit";
import { withIronSessionApiRoute } from "iron-session/next";
import { sessionOptions } from "lib/session";
const octokit = new Octokit();

export default withIronSessionApiRoute(async (req, res) => {
  const { username } = await req.body;

  try {
    const {
      data: { login, avatar_url },
    } = await octokit.rest.users.getByUsername({ username });

    const user = { isLoggedIn: true, login, avatarUrl: avatar_url };
    req.session.user = user;
    await req.session.save();
    res.json(user);
  } catch (error) {
    res.status(500).json({ message: error.message });
  }
}, sessionOptions);

字符串
你可以看到我引用的完整代码:https://github.com/vvo/iron-session follow /examples/next.js/
现在,我面临的问题是,nextJS中的应用路由器需要POST()或GET()函数才能正常工作,而我并不完全理解withIronSessionApiRoute()是如何将自己包裹在路由周围的。
我已经广泛地研究了nextJS文档,但没有发现太多关于将页面路由器迁移到应用路由器的内容。有什么建议或想法吗?
我希望这个问题能得到明确的回答,如果没有,请随时提出澄清问题。
一如既往,谢谢!克里斯·鲁德

btxsgosb

btxsgosb1#

我最近将一个应用程序迁移到应用程序路由器,withIronSessionSsr方法只是一个更容易使用的 Package 器,要实现相同的功能,您只需利用低级的密封/解封方法。类似这样的东西(在服务器组件中):

import { unsealData } from 'iron-session/edge';
import { cookies } from 'next/headers';

export default async function Page() {
  const cookieStore = cookies();

  const encryptedSession = cookieStore.get('name-of-your-cookie')?.value;

  const session = encryptedSession
    ? await unsealData(encryptedSession, {
        password: 'your-password',
      })
    : null;

  return <div>{session ? session.some_value : 'not authenticated'}</div>;
}

字符串
创建会话可能很棘手,因为您需要在路由处理程序或中间件中使用cookie头设置加密会话。

import { sealData } from 'iron-session/edge';

// endpoint to log in a user
export async function POST() {
  const session = JSON.stringify({
    userId: 1,
    name: 'john doe',
  });

  const encryptedSession = sealData(session, {
    password: 'your-password',
  });

  return new Response('ok', {
    status: 200,
    headers: { 'Set-Cookie': `name-of-your-cookie=${encryptedSession}` },
  });
}


图片来源:https://github.com/vvo/iron-session/issues/594#issuecomment-1638964195

相关问题