【问题标题】:Next-Auth - Custom OAuth 2.0 Provider IntegrationNext-Auth - 自定义 OAuth 2.0 提供程序集成
【发布时间】:2021-09-14 09:36:03
【问题描述】:

我们有自己的 OAuth 2.0 实施,我正在使用 next-auth 连接并在我的 Next.js 应用程序中获取 jwt。

输出: 目前,我可以登录。但是,我在客户端获得了 null 作为令牌。

我已实施的步骤:

  • 在顶层添加了next-auth Provider 组件。
    function MyApp({ Component, pageProps }) {
      return (
        <Provider
          options={{
            clientMaxAge: 0,
            keepAlive: 0,
          }}
          session={pageProps.session}>
          <Component {...pageProps} />
        </Provider>
      );
    }
  • 文件:pages/api/auth/[...nextauth].js:
export default NextAuth({
  providers: [
    {
      id: "quot-test",
      name: "quot-test",
      type: "oauth",
      version: "2.0",
      scope: "openid email",
      state: true,
      protection: "state",
      params: { grant_type: "authorization_code" },
      idToken: true,
      authorizationUrl:
        "http://localhost:9000/oauth2/authorize?response_type=code",
      accessTokenUrl: "http://localhost:9000/oauth2/token",
      requestTokenUrl: "http://localhost:9000/oauth2/jwks",
      clientId: process.env.QUOT_ID,
      clientSecret: process.env.QUOT_SECRET,
    },
  ],
  secret: process.env.SECRET,
  debug: true,
  session: {
    jwt: true,
    maxAge: 60 * 5,
  },
  jwt: {
    secret: process.env.SECRET,
    encryption: false,
  },
  callbacks: {
    async signin(user, account, profile) {
      console.log("user", user, account, profile);
      return true;
    },
    async jwt(token, user, account, profile, isNewUser) {
      console.log(token);
      console.log(user);
      console.log(account);
      console.log(profile);
      console.log(isNewUser);
      if (account.accessToken) {
        token.accessToken = account.accessToken;
      }
      return Promise.resolve(token);
    },
    async session(session, token) {
      console.log(session);
      console.log(token);
      return session;
    },
  },
});

这是第一个问题所在:没有触发任何回调,也没有在终端上打印 console.log。我上面的配置似乎有问题?

  • 添加了signIn/ signOut 以在主页上使用身份验证服务登录。
import { signIn, signOut, useSession, getSession } from "next-auth/client";

export default function Home(){
  ...
  const [session, loading]  = useSession();
  console.log(session); // prints null after signin
  return(
  <button onClick={() =>signIn(null, { callbackUrl: "http://localhost:3000/happy" })}>
    Sign 
  </button>
  ...

这是下一个问题的地方:即使登录函数中的callbackUrl指向页面'/happy',我仍然被带到主页!

  • 我在根目录中有 .env.local 文件,其中包含以下内容:
NEXTAUTH_URL=http://localhost:3000/

QUOTECH_ID=quot-test
QUOTECH_SECRET=[secret-from-authenticator-goes-here]
SECRET=[random-string-goes-here]

我错过了什么?一旦我被客户端应用程序重定向,为什么我会收到null。上面的[...nextauth].js 文件中的某些选项似乎被忽略了?

【问题讨论】:

    标签: javascript reactjs oauth-2.0 next.js next-auth


    【解决方案1】:

    自定义提供程序需要配置文件值,如果您更新它们应该可以工作。

    {
      ...,
      profileUrl: string,
      profile: function,
      ...
    }
    

    在文档中,您可以看到这些区域是必填字段。

    profileUrl 应该是获取个人资料信息的个人资料链接 profile 是一个函数,您可以操作此配置文件 url 返回以适合 next-auth 配置文件模式或您的自定义配置文件模式。

    例子;

    {
     id: "quot-test",
     name: "quot-test",
     type: "oauth",
     version: "2.0",
     scope: "openid email",
     state: true,
     protection: "state",
     params: { grant_type: "authorization_code" },
     idToken: true,
     authorizationUrl: "http://localhost:9000/oauth2/authorize?response_type=code",
     accessTokenUrl: "http://localhost:9000/oauth2/token",
     requestTokenUrl: "http://localhost:9000/oauth2/jwks",
     profileUrl: "[ProfileURL]",
     profile(profile, tokens) {
      return {
              id: profile.id,
              name: profile.name,
              email: profile.email
             };
     },
     clientId: process.env.QUOT_ID,
     clientSecret: process.env.QUOT_SECRET,
    }
    

    【讨论】:

    • 嗨 Tuna,任何工作的样品提供者都会受到最高的赞赏 :-)
    猜你喜欢
    • 2021-05-10
    • 2022-08-23
    • 2022-01-07
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 2013-10-29
    相关资源
    最近更新 更多