[Next.js14] NextAuth v5 (3) - Google 登录

ops/2024/11/9 4:33:28/

Google Cloud 设置

访问 https://console.cloud.google.com/apis

e7712bd89b6fbbd8b0a6b0ba934138a4.png

如果你是第一次使用Google Cloud,请确保同意服务条款。

按照以下步骤继续:

38774a90a8664023b43e565d9ee40366.png

ea85d02adee8c3299c0ec5c8ec15e591.png

eced77c89c01ac8546a982644cce0bde.png

根据你的喜好编辑项目名称,然后点击"CREATE"

9f4eede0e2cd145d7eaf644fda07ad9e.png你将被重定向到这个界面

👉 OAuth 同意屏幕

让我们首先配置OAuth同意屏幕

ceb0dd8257a8877742efb017f97af30f.png

1efe6217b541b88ab93080c24fa380e6.png

如果你的组织中有内部测试人员,选择Internal用户类型。否则继续选择External用户

f2c2cb6f562d29954df5a9fefe7e45c8.png

编辑应用名称并选择用户支持邮箱,然后向下滚动直到找到"Developer contact information"(开发者联系信息)

9668b13396cbf6e7053d48cbff55976b.png

填写电子邮件地址,然后点击"SAVE AND CONTINUE"(保存并继续)按钮

依次点击剩余步骤(Scopes、Test Users、Summary)的"SAVE AND CONTINUE"按钮

👉 凭据

现在设置凭据

03d5c08295d5dbb04dc2b29f203b6f41.png

首先选择应用类型为"Web"

897e63a0d048bfb013aa538b4ef03749.png

然后填写"Name"部分,并点击Authorized redirect URIs下方的"ADD URI"按钮。

在URIs部分填写 http://localhost:3000/api/auth/callback/google ,然后点击"CREATE"按钮

🔴注意🔴 部署服务时,确保将URI修改为:https://${部署域名URL}/api/auth/callback/google 以避免错误。

235233e1c0fad2c7b0fe9dd241b47022.png

几秒钟后,你将收到OAuth客户端已创建的通知,并可以查看和复制"Client ID"和"Client Secret"

最后将"Client ID"和"Client Secret"添加到你的.env文件中

GOOGLE_CLIENT_ID = ${YOUR GOOGLE CLIENT ID}
GOOGLE_CLIENT_SECRET =${YOUR GOOGLE CLIENT SECRET}

代码实现

首先,在src/auth.ts中添加Google provider
// src.auth.ts
import NextAuth from 'next-auth';
import { authConfig } from './auth.config';
import Credentials from 'next-auth/providers/credentials';
import { User } from '@/lib/definitions';
import google from 'next-auth/providers/google'; // 添加导入export const { handlers: { GET, POST }, auth, signIn, signOut, update } = NextAuth({...authConfig,providers: [// **************************************************************// 添加providergoogle({clientId: process.env.GOOGLE_CLIENT_ID ?? '',clientSecret: process.env.GOOGLE_CLIENT_SECRET ?? '',}),// **************************************************************Credentials({async authorize(credentials) {if (credentials.id && credentials.password) {// 在这里添加你的后端代码// let loginRes = await backendLogin(credentials.id, credentials.password)let loginRes = {success : true,data : {user: {ID: "john_doe",NAME: "John Doe",EMAIL: "email@email.email",},}}// 登录失败if (!loginRes.success) return null;// 登录成功const user = {id: loginRes.data.user.ID ?? '',name: loginRes.data.user.NAME ?? '',email: loginRes.data.user.EMAIL ?? '',} as User;return user;}return null;},})],callbacks: {async session({ session, token, user }) {session.user = token.user as Userreturn session;},async jwt({ token, user, trigger, session }) {if (user) {token.user = user;}if (trigger === "update" && session) {token = {...token, user : session}return token;};return token;},},
});

在src/lib/actions.ts中创建一个在客户端调用的Google登录方法

// src/lib/actions.ts
"use server"import { signIn } from "../auth";
import { AuthError } from "next-auth";...export async function googleAuthenticate(prevState: string | undefined,formData: FormData,
) {try {await signIn('google');} catch (error) {if (error instanceof AuthError) {return 'google log in failed'}throw error;}
}

确保src/app/api/auth/[…nextauth]/route.ts文件存在

// src/app/api/auth/[...nextauth]/route.ts
export { GET, POST } from "@/auth"
export const runtime = "edge"

最后,在登录页面src/app/login/page.tsx中创建Google登录按钮

// src/app/login/page.tsx
"use client"import { authenticate, googleAuthenticate } from "@/lib/actions" // 添加导入
import { useFormState } from "react-dom"export default function Page() {const [errorMsg, dispatch] = useFormState(authenticate, undefined)const [errorMsgGoogle, dispatchGoogle] = useFormState(googleAuthenticate, undefined) //googleAuthenticate钩子return (<div><h1>Log in Page</h1><form className="flex flex-col" action={dispatch}><input className="bg-blue-300 text-black" name="id"></input><input className="bg-yellow-300 text-black" name="password" type="password"></input><button>Log In</button><p>{errorMsg}</p></form>{/* 添加Google登录按钮 */}<br /><form className="flex flex-col" action={dispatchGoogle}><button>Google Sign In</button><p>{errorMsgGoogle}</p></form>{/* 添加Google登录按钮 */}</div>)}

现在使用npx next dev或npm run dev运行Next应用,访问 http://localhost:3000/login 并点击"Google Sign In"按钮。你将被重定向到Google的OAuth同意屏幕。

成功登录Google账户后,你将被重定向回主页,你的Google账户详细信息将打印在终端上!

a611bf36c2d4669a7b0e6ebf27bd890e.png

源代码和备注

https://github.com/youngjun625/nextauth14-nextauthv5?source=post_page-----3683d8fae69c--------------------------------

最后:

React Hook 深入浅出

CSS技巧与案例详解

vue2与vue3技巧合集

VueUse源码解读


http://www.ppmy.cn/ops/132114.html

相关文章

git的使用、router和route的区别以及v-show和v-if的差别

这里写目录标题 多人协作使用git的步骤&#xff08;使用gitub&#xff09;建立自己的空仓库连接远程仓库使伙伴可以使用仓库将代码拉入空仓库进行git指令的学习 router和route的区别router定义&#xff1a;用途&#xff1a; route定义&#xff1a;用途&#xff1a; v-show和v-i…

C++builder中的人工智能(10)神经网络中的Sigmoid函数

在这篇文章中&#xff0c;我们将探讨最受欢迎的激活函数之一——Sigmoid函数。我们将解释什么是Logistic函数&#xff0c;以及它与Sigmoid函数的区别&#xff0c;并展示如何在C应用中使用这些函数。 目录 人工神经网络&#xff08;ANN&#xff09;中的激活函数是什么&#xff…

WPF怎么通过RestSharp向后端发请求

1.下载RestSharpNuGet包 2.请求类和响应类 public class ApiRequest {/// <summary>/// 请求地址/// </summary>public string Route { get; set; }/// <summary>/// 请求方式/// </summary>public Method Method { get; set; }/// <summary>//…

【TabBar嵌套Navigation案例-常见问题按钮-WebView-加载网页 Objective-C语言】

一、接下来呢,当我们点击这个cell的时候,我们应该modal出来一个控制器啊,像我们示例程序一样, 1.像示例程序一样 然后呢,这个控制器,实际上,是一个WebView, 里边有一个控件儿,叫webView,我们来做一下, 我们首先要找到点击cell的方法,在这个常见问题里边,helpCon…

WebStorm技巧

WebStorm&#xff1a;前端开发的加速技巧 &#x1f680; 前端工程师们&#xff0c;想不想让你的开发速度快得飞起来&#xff1f;今天我们就来解锁WebStorm中的那些让人惊叹的黑科技&#xff01; 第一关&#xff1a;环境配置篇 ⚙️ 1. 性能优化设置 // 推荐配置 {"memor…

flutter鸿蒙next 使用 InheritedWidget 实现跨 Widget 传递状态

在 Flutter 中&#xff0c;状态管理是开发过程中一个至关重要的部分。Flutter 提供了多种方式来实现组件间的状态传递&#xff0c;其中一种比较底层的方式是使用 InheritedWidget。虽然 InheritedWidget 主要用于将数据传递给其子树中的小部件&#xff0c;但它也是许多更高级状…

SAP-MM-下单配置增强TM-PI

接口开发功能说明 业务背景将开发的接口的整体业务背景进行概要说明,可以用图进行描。 用户在物流管理系统执行创建采购订单操作时,通过PI系统传递采购订单数据到SAP ERP系统中,同时,将相关信息写入到SAP ERP系统中的下单配置据库表。 接口清单以清单方式与对方系统之间的所…

如何利用指纹浏览器爬虫绕过Cloudflare的防护?

网络爬虫能够系统地浏览网页并提取所需的数据&#xff0c;通常被用于市场研究、数据分析或者竞争情报。然而&#xff0c;一些反爬虫机制给网络爬虫的工作带来了不少挑战和风险。 其中&#xff0c;Cloudflare提供了多层次的防护机制&#xff0c;包括IP封锁、速率限制、CAPTCHA验…