尝试配置下一个身份验证登录页面,但 getProviders() 出现问题

Posted

技术标签:

【中文标题】尝试配置下一个身份验证登录页面,但 getProviders() 出现问题【英文标题】:trying to configure next-auth signin page, but having a problem with getProviders() 【发布时间】:2021-12-31 04:01:19 【问题描述】:

各位程序员们好,

我正在构建一个 nextJs 应用程序,使用 next-auth 进行用户登录。我在“pages/api/auth”中创建了 [...nextauth].js 文件,在“pages/auth/”中创建了一个 signin.js 文件,这些文件的代码写在下面以供参考。我遇到的问题是,当我尝试访问登录页面时,我不断收到以下错误:“TypeError: Cannot convert undefined or null to object”

下面是项目中的依赖及其对应版本的列表:

“依赖”: "@heroicons/react": "^1.0.5", "@tailwindcss/forms": "^0.3.4", “伪造者”:“^5.5.3”, “火力基地”:“^9.4.0”, “下一个”:“最新”, "next-auth": "^4.0.0-beta.7", “反应”:“^17.0.2”, “反应域”:“^17.0.2”, “顺风滚动条隐藏”:“^1.0.4” ,

[..nextauth].js 代码:

import NextAuth from "next-auth";
import GithubProvider from "next-auth/providers/github";

export default NextAuth(
  // Configure one or more authentication providers
  providers: [
    GithubProvider(
      clientId: process.env.GITHUB_ID,
      clientSecret: process.env.GITHUB_SECRET,
    ),
  ],

  pages: 
    signIn: "/auth/signin",
  ,
);

signin.js 代码:

import  getProviders, signIn as signIntoProvider  from "next-auth/react";

function signIn( providers ) 
  return (
    <>
      Object.values(providers).map((provider) => (
        <div key=provider.name>
          <button
            onClick=() => 
              signIntoProvider(provider.id);
            
          >
            Sign In with provider.name
          </button>
        </div>
      ))
    </>
  );

export async function getServerSideProps(context) 
  const providers = await getProviders();

  return 
    props: 
      providers,
    ,
  ;


export default signIn;

Error Code

控制台日志记录“providers”显示“null”,所以我认为 getProviders 出于某种原因无法正常工作。知道为什么会这样吗?

非常感谢。

【问题讨论】:

我在相同的代码上遇到了同样的错误。你能解决这个问题吗? 【参考方案1】:

我有同样的问题。我尝试控制台记录等待 getProviders 的结果,但它无法获取,因为它试图获取 https://localhost:3000/api/auth/providers 而不是 http://localhost:3000/api/auth/providers。

我的 .env.local 中有错误的 NEXTAUTH_URL。它应该是 http://localhost:3000 而不是 https://localhost:3000。

【讨论】:

【参考方案2】:

我已经通过将 getProviders 移入状态来解决这个问题...

const SignIn = () => 
  const [providers, setProviders] = useState(null);

  useEffect(() => 
    (async () => 
      const res = await getProviders();
      setProviders(res);
    )();
  , []);

  return (
    <>
      providers &&
        Object.values(providers).map((provider) => (
          <div key=provider.name>
            <button
              onClick=() => 
                signIn(provider.id);
              
            >
              Sign in with provider.name
            </button>
          </div>
        ))
    </>
  );
;

【讨论】:

以上是关于尝试配置下一个身份验证登录页面,但 getProviders() 出现问题的主要内容,如果未能解决你的问题,请参考以下文章

带有 Firebase 身份验证的 Nuxt s-s-r 身份验证防护

Blazor Wasm 身份验证

护照身份验证不适用于 nodejs 和 mysql

Pyramid 中的强制性身份验证

使用 Passport 进行社交身份验证登录后如何重定向到个人资料页面? (角度,快递,护照,jwt)

尝试使用有效令牌直接访问页面时,JWT 身份验证不起作用;将在登录时开始工作。反应/节点/快递