Next-Auth -自定义OAuth 2.0提供程序集成

eimct9ow  于 2023-10-15  发布在  其他
关注(0)|答案(1)|浏览(150)

我们有自己的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以使用auth服务登录。
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文件中似乎忽略了一些选项?

cyvaqqii

cyvaqqii1#

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

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

在文档中,您可以看到这些区域是必填字段。
profileUrl应该是一个配置文件链接,以获取配置文件信息和配置文件是一个函数,你操纵这个配置文件URL返回适合下一个认证配置文件模式或您的自定义配置文件模式。
示例;

{
 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,
}

相关问题