next-auth [next-auth][error][CLIENT_FETCH_ERROR]尝试获取资源时网络错误

axkjgtzd  于 2023-05-06  发布在  其他
关注(0)|答案(2)|浏览(308)

我正在尝试使用next-auth实现Google OAuth。我的问题是,当我尝试使用Google作为提供商登录时,当我单击按钮时,它会将我重定向到http://localhost:3000/api/auth/error:图片error path。我想做的是,当你点击“使用Google登录”按钮时,它会将你重定向到Google的OAuth页面。

控制台错误:

[next-auth][error][CLIENT_FETCH_ERROR]https://next-auth.js.org/errors#client_fetch_error尝试获取资源时出现网络错误。对象{错误:联系我们“/API/auth/providers”,消息:“尝试获取资源时出现NetworkError。”}

我尝试过的:

  • 重置我的GOOGLE_CLIENT_ID和GOOGLE_CLIENT_SECRET以及NEXTAUTH_SECRET
  • 正在添加“secret:NEXTAUTH_SECRET”作为我的[... nextauth].ts文件的提供程序的选项,尽管根据文档它是不需要的
  • 将localhost:3000/API/auth/callback/google直接输入到URL中,这起作用了,我能够在我的主页中访问我的会话对象。它把我送到这里OAuth Page
  • 将next-auth从4.14.0更新为4.15.0
  • 已从http://localhost:3000清除cookie和会话
  • 在Vercel上部署了适当的环境变量,并将域添加到Google凭据中,然后尝试从我的手机和PC上登录,无论有无WiFi。
  • 已尝试使用FireFox、FireFox隐身模式、Google Chrome、Google Chrome隐身模式登录
  • 已尝试使用不带任何参数的signIn()
  • 花了几个小时尝试StackOverflow和Nextjs官方github问题部分给出的许多可能的解决方案
    /client/pages/API/auth/[...nextauth].ts:
import NextAuth, { NextAuthOptions } from "next-auth";
import GoogleProvider from "next-auth/providers/google";

export const authOptions: NextAuthOptions = {
  providers: [
    GoogleProvider({
      clientId: process.env.GOOGLE_CLIENT_ID as string,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET as string,
    }),
  ],
};

export default NextAuth(authOptions);

/client/pages/login.tsx OAuth组件,其中props传递给按钮:

<OAuth
    company={"Google"}
    handleLogin={() =>
      signIn("google", { callbackUrl: "http://localhost:3000/" })
    }
  />

/client/.env文件:

GOOGLE_CLIENT_ID=***********
GOOGLE_CLIENT_SECRET=***********

NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=122a918b879a0d7e331c0795f435d084

在我的Google Developers Credentials中,我有

  • http://localhost:3000/api/auth/callback/google在Authorized redirect URI部分
  • http://localhost:3000在Authorized JavaScript origins部分
    --编辑:找到修复。--
    解决方案:
<OAuth
    company={"Google"}
    handleLogin={(e) => {
      e.preventDefault();
      signIn("google", { callbackUrl: REDIRECT_URL_AFTER_SIGN_IN });
    }}
  />
nbewdwxp

nbewdwxp1#

找到了一个修复方法,并将其添加到帖子的底部。我所做的唯一更改是在调用signIn()之前添加e.preventDefault()。如果有人能解释为什么这会起作用,那就太好了!

yptwkmov

yptwkmov2#

不知道为什么这真的有效,但它对我也有效。
我有一个自定义按钮组件,将做同样的事情,它总是需要2次点击的sighn在实际上得到谷歌登录页面显示。在添加e.preventDefault()之后,这个问题就消失了。
作为参考,我使用Next.js v13,NextAuth和Google作为Auth提供商。

import { useSession, signIn, signOut } from 'next-auth/react'
import { Button } from './Button'

export default function LoginButton() {
  const { data: session } = useSession()
  if (session) {
    return (
      <>
        <Button
          type="submit"
          variant="solid"
          color="blue"
          className="my-10 w-full"
          onClick={() => signOut('google', { callbackUrl: '/' })}
        >
          Sign out
        </Button>
      </>
    )
  }
  return (
    <>
      <Button
        type="submit"
        variant="solid"
        color="blue"
        className="my-10px w-full"
        onClick={(e) => {
          e.preventDefault()
          signIn('google', {
            callbackUrl: '/Dashboard/DefaultDash',
          })
        }}
      >
        Sign in with google
      </Button>
    </>
  )
}

编辑:在深入挖掘后,我认为这是因为默认情况下,谷歌正在期待一个调用/参数寻找CRSF令牌,或跨站请求伪造令牌。通过使用preventDefault(),它绕过了这个要求。

相关问题