怎样在NEXT.JS中设置next-auth并实现登入登出

news2024/11/15 10:58:59

参考代码link:https://github.com/luomi16/next-auth-demo

在Next.js中使用next-auth来实现登录和登出功能是一种流行且相对简单的方法。next-auth是一个专为Next.js开发的认证库,支持多种认证提供者,如Google、Facebook、Twitter以及基于邮箱的登录等。

以下是如何在Next.js项目中设置next-auth以实现登录和登出的基本步骤:

1. 安装next-auth

首先,你需要在你的Next.js项目中安装next-auth。打开你的终端,进入你的项目目录,然后运行:

npm install next-auth

或者,如果你使用yarn

yarn add next-auth

2. 配置next-auth

接下来,你需要在你的项目中创建一个next-auth的配置文件。通常,这个文件位于app/api/auth/[...nextauth].js。在这个文件中,你可以配置你的认证提供者、数据库连接(如果需要)以及其他相关设置。

例如,使用Google和Github作为认证提供者,配置文件:

// pages/api/auth/[...nextauth]/route.ts
import NextAuth, { AuthOptions } from "next-auth";
import GithubProvider from "next-auth/providers/github";
import GoogleProvider from "next-auth/providers/google";

const authOptions: AuthOptions = {
  providers: [
    GithubProvider({
        clientId: process.env.GITHUB_CLIENT_ID as string,
        clientSecret: process.env.GITHUB_CLIENT_SECRET as string
    }),
    GoogleProvider({
        clientId: process.env.GOOGLE_CLIENT_ID as string,
        clientSecret: process.env.GOOGLE_CLIENT_SECRET as string
    })
  ],
  pages: {
    signIn: '/sign-in',
  },
  secret: process.env.NEXTAUTH_SECRET,
};

const handler = NextAuth(authOptions);

export { handler as GET, handler as POST };

3. .env文件配置

确保你在.env文件中添加了必要的环境变量,如GOOGLE_CLIENT_IDGOOGLE_CLIENT_SECRET

GITHUB_CLIENT_ID=<你的GitHub客户端ID>
GITHUB_CLIENT_SECRET=<你的GitHub客户端密钥>
GOOGLE_CLIENT_ID=<你的Google客户端ID>
GOOGLE_CLIENT_SECRET=<你的Google客户端密钥>
NEXTAUTH_URL=http://localhost:3000/
NEXTAUTH_SECRET=<一个随机字符串作为你的NextAuth密钥>

4. 实现登录和登出

为了管理用户的登录状态,我们使用next-auth提供的useSession钩子。下面是一个在导航栏中实现登录状态检查和登出按钮的示例:

//components/Navbar.tsx
"use client";

import Link from "next/link";
import { useSession, signOut } from "next-auth/react";

export default function Navbar() {
  const { status } = useSession();
  return (
    <div className="flex justify-between pb-4 border-b mb-4">
      {status === "authenticated" ? (
        <div><button className="btn" onClick={() => signOut()}>Sign out</button></div>
      ) : (
        <div className="flex items-center">
          <Link className="btn" href={"/sign-in"}>
            Sign in
          </Link>
        </div>
      )}
    </div>
  );
}

对于登录页面和按钮,我们可以创建一个简单的组件来处理登录逻辑:

// components/SignInBtns.tsx
"use client"
import {signIn} from "next-auth/react"

export default function SignInBtns() {
  return (
    <>
      <h1 className="text-center mt-8">Sign in</h1>
      <div className="mt-4 p-4 flex flex-col items-center justify-center gap-4">
        <button onClick={() => signIn('github')} className="flex items-center border p-4 rounded-full gap-4 hover:bg-slate-200/25 transition">
          <span>
            <svg
              width="31"
              height="30"
              viewBox="0 0 104 101"
              fill="none"
              xmlns="http://www.w3.org/2000/svg"
            >
              <g clipPath="url(#clip0_88_9)">
                <path
                  d="M51.928 0.880554C23.6545 0.880554 0.727539 23.8032 0.727539 52.081C0.727539 74.7027 15.398 93.8948 35.7415 100.665C38.3003 101.139 39.2398 99.5542 39.2398 98.2019C39.2398 96.981 39.1923 92.9477 39.1702 88.6694C24.9262 91.7666 21.9206 82.6284 21.9206 82.6284C19.5915 76.7104 16.2357 75.1368 16.2357 75.1368C11.5903 71.959 16.5859 72.0243 16.5859 72.0243C21.7273 72.3855 24.4345 77.3005 24.4345 77.3005C29.001 85.1279 36.4122 82.865 39.3339 81.5567C39.7934 78.2476 41.1203 75.9889 42.5846 74.7103C31.2123 73.4156 19.2575 69.0254 19.2575 49.4068C19.2575 43.8169 21.2576 39.2495 24.5328 35.6639C24.0012 34.3743 22.2487 29.1668 25.0288 22.1143C25.0288 22.1143 29.3283 20.7382 39.1126 27.3625C43.1967 26.2281 47.5768 25.6592 51.928 25.6397C56.2792 25.6592 60.6626 26.2281 64.7544 27.3625C74.5268 20.7382 78.8203 22.1143 78.8203 22.1143C81.6072 29.1668 79.8538 34.3743 79.3222 35.6639C82.6051 39.2495 84.5917 43.8169 84.5917 49.4068C84.5917 69.072 72.614 73.402 61.2129 74.6696C63.0493 76.2585 64.6857 79.3744 64.6857 84.1512C64.6857 91.0019 64.6263 96.5155 64.6263 98.2019C64.6263 99.5644 65.5479 101.161 68.1432 100.658C88.4757 93.8804 103.128 74.695 103.128 52.081C103.128 23.8032 80.204 0.880554 51.928 0.880554ZM19.9038 73.8166C19.791 74.071 19.3908 74.1473 19.0262 73.9726C18.6549 73.8056 18.4463 73.4588 18.5667 73.2036C18.6769 72.9416 19.0779 72.8687 19.4485 73.0442C19.8207 73.2113 20.0326 73.5614 19.9038 73.8166ZM22.4223 76.0639C22.1781 76.2902 21.7007 76.1851 21.3768 75.8273C21.0419 75.4703 20.9792 74.993 21.2268 74.7632C21.4786 74.5369 21.9415 74.6428 22.2773 74.9998C22.6122 75.361 22.6775 75.8349 22.4223 76.0639ZM24.15 78.9391C23.8363 79.157 23.3234 78.9527 23.0063 78.4974C22.6926 78.0421 22.6926 77.496 23.0131 77.2773C23.331 77.0585 23.8363 77.2552 24.1577 77.7071C24.4705 78.1701 24.4705 78.7161 24.15 78.9391ZM27.0721 82.269C26.7914 82.5785 26.1937 82.4954 25.7562 82.0732C25.3085 81.6603 25.1839 81.0744 25.4654 80.7649C25.7494 80.4546 26.3506 80.5419 26.7914 80.9608C27.2357 81.3728 27.3714 81.9629 27.0721 82.269ZM30.8485 83.3932C30.7248 83.7942 30.1491 83.9765 29.5691 83.8061C28.99 83.6306 28.6111 83.1609 28.7281 82.7556C28.8485 82.352 29.4267 82.1621 30.0109 82.3444C30.5891 82.519 30.9689 82.9853 30.8485 83.3932ZM35.1463 83.87C35.1607 84.2922 34.669 84.6424 34.0602 84.65C33.4481 84.6636 32.9529 84.3219 32.9461 83.9065C32.9461 83.48 33.4269 83.1332 34.039 83.123C34.6478 83.1112 35.1463 83.4503 35.1463 83.87ZM39.3684 83.7082C39.4413 84.1202 39.0182 84.5433 38.4137 84.6561C37.8194 84.7646 37.2691 84.5102 37.1936 84.1016C37.1199 83.6793 37.5506 83.2562 38.1441 83.1469C38.7495 83.0417 39.2912 83.2893 39.3684 83.7082Z"
                  fill="#161614"
                />
              </g>
              <defs>
                <clipPath id="clip0_88_9">
                  <rect
                    width="102.4"
                    height="100"
                    fill="white"
                    transform="translate(0.727539 0.880554)"
                  />
                </clipPath>
              </defs>
            </svg>
          </span>
          Sign In With Github
        </button>
        <button onClick={() => signIn('google')} className="flex items-center border p-4 rounded-full gap-4 hover:bg-slate-200/25 transition">
          <span>
            <svg
              width="30"
              height="30"
              viewBox="0 0 100 100"
              fill="none"
              xmlns="http://www.w3.org/2000/svg"
            >
              <path
                d="M94 51.0417C94 47.7917 93.7083 44.6667 93.1667 41.6667H50V59.3959H74.6667C73.6042 65.125 70.375 69.9792 65.5208 73.2292V84.7292H80.3333C89 76.75 94 65 94 51.0417Z"
                fill="#4285F4"
              />
              <path
                d="M50.0001 95.8333C62.3751 95.8333 72.7501 91.7291 80.3334 84.7291L65.5209 73.2291C61.4167 75.9791 56.1667 77.6041 50.0001 77.6041C38.0626 77.6041 27.9584 69.5416 24.3542 58.7083H9.04175V70.5833C16.5834 85.5625 32.0834 95.8333 50.0001 95.8333Z"
                fill="#34A853"
              />
              <path
                d="M24.3543 58.7084C23.4376 55.9584 22.9168 53.0209 22.9168 50C22.9168 46.9792 23.4376 44.0417 24.3543 41.2917V29.4167H9.04175C5.83341 35.8036 4.16392 42.8526 4.16675 50C4.16675 57.3959 5.93759 64.3959 9.04175 70.5834L24.3543 58.7084Z"
                fill="#FBBC05"
              />
              <path
                d="M50.0001 22.3959C56.7292 22.3959 62.7709 24.7084 67.5209 29.25L80.6668 16.1042C72.7292 8.70835 62.3542 4.16669 50.0001 4.16669C32.0834 4.16669 16.5834 14.4375 9.04175 29.4167L24.3542 41.2917C27.9584 30.4584 38.0626 22.3959 50.0001 22.3959Z"
                fill="#EA4335"
              />
            </svg>
          </span>
          Sign In With Google
        </button>
      </div>
    </>
  );
}

并且在登录页面app/sign-in/page.tsx中使用这个组件:

// app/sign-in/page.tsx
import SignInBtns from "@/components/SignInBtns";

export default function Introduction() {
    return <div><SignInBtns /></div>;
}

5. 在app/layout.tsx中包裹你的组件以使用SessionProvider

为了让next-auth能在你的应用中正确管理会话,需要在应用的顶层添加SessionProvider

// app/layout.tsx
import type { Metadata } from "next";
import { Inter } from "next/font/google";
import "./globals.css";
import Navbar from "@/components/Navbar";
import { NextAuthProvider } from "@/components/Providers";

const inter = Inter({ subsets: ["latin"] });

export const metadata: Metadata = {
  title: "Next",
  description: "Generated by create next app",
};

export default function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode;
}>) {
  return (
    <html lang="en">
      <body className={inter.className}>
        <NextAuthProvider>
          <div className="lg:max-w-[900px] lg:px-16 mx-auto py-8 shadow-xl min-h-screen flex flex-col px-8">
            <Navbar />
            <main className="flex-auto">{children}</main>
          </div>
        </NextAuthProvider>
      </body>
    </html>
  );
}

其中NextAuthProvider是我们自定义的组件,用于包裹SessionProvider。它的定义如下:

// components/Providers.tsx
"use client";

import { SessionProvider } from "next-auth/react";

export const NextAuthProvider = ({children}: {children: React.ReactNode}) => {
    return <SessionProvider>{children}</SessionProvider>
}

完成

通过以上步骤,你已经在你的Next.js应用中集成了next-auth,实现了基于GitHub和Google的登录。next-auth提供了许多高级功能和配置选项,你可以在其官方文档中找到更多信息。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1545554.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

档案四性检测可复用组件接口说明

nhdeep提供在归档、移交与接收、长期保存等各环节根据需求进行自主配置和调用的可复用组件&#xff0c;支持客户端和接口调用两种功能使用模式。档案四性检测组件为自建档案管理系统和各种业务系统&#xff08;如OA&#xff09;&#xff0c;提供标准化的档案四性检测功能利用&a…

【分享】CMMI V3.0版本做了哪些改变?哪些企业适合申请CMMI3.0

​ CMM是由美国卡内基梅隆大学软件工程研究所1987年开发成功的&#xff0c;它基于过去所有软件工程过程改进的成果&#xff0c;吸取了以往软件工程的经验教训&#xff0c;提供了一个基于过程改进的框架&#xff1b;CMMI(Capability Maturity Model Integration能力成熟度模型集…

esp单片机下arduino_gfx不相干显示驱动优化对flash空间的占用对比

一般情况下&#xff0c;很多esp32或者esp8266下的tft模块驱动都会包含很多种&#xff0c;而我们只需要其中一种&#xff0c;那就有个疑问这些被编译进的显示驱动到底占用了多少空间&#xff0c;是否需要把他优化掉&#xff1f; 这是默认的驱动列表&#xff1a; 84个文件&…

Android14之深入理解sp模板类(二百零二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

C语言例4-12:从键盘输入一个学生的学号、性别和一门课程的成绩后输出该学生的信息

代码如下&#xff1a; //从键盘输入一个学生的学号、性别和一门课程的成绩后输出该学生的信息 #include<stdio.h> int main(void) {int num; //定义整型变量num存放学生的学号char sex; //定义字符型变量sex存放学生的性别float score; //定义实型变量score存放学…

实现多线程方式你知道几种?

实现多线程通常有以下四种方式&#xff1a; 继承 Thread 类。实现 Runnable 接口。实现 Callable 接口。线程池实现多线程。 继承 Thread 类&#xff1a; public class ThreadDemo extends Thread{Overridepublic void run(){System.out.println("Thread 类实现多线程,…

现在的市场对 C++ 的需求大吗?

先说结论&#xff1a;需求还是很大&#xff0c;但是没有什么初级程序员能干的岗位。 游戏引擎&#xff0c;存储&#xff0c;推荐引擎&#xff0c;infra&#xff0c;各种各样的性能敏感场景。 在开始前我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;…

Linux系统服务

文章目录 什么是daemon与服务(service)systemd使用unit分类 通过systemctl管理服务通过systemctl管理单一服务(service unit)通过systemctl查看系统上所有的服务通过systemctl管理不同的操作环境(target unit)通过systemctl分析各服务之间的依赖性与systemd的daemon运行过程相关…

基于nodejs+vue铁路订票管理系统python-flask-django-php

该铁路订票管理系统采用前后端分离进行设计&#xff0c;并采用nodejs语言以及express框架进行开发。本系统主要设计并完成了用户登录管理过程、个人信息修改、用户管理、火车类型管理、火车信息管理、车票预订管理、车票退票管理、系统管理等功能。该系统操作简单&#xff0c;界…

考研数学|武忠祥高数全年学习包分享

u1s1&#xff0c;武忠祥老师的课程真的不错&#xff0c;宝藏级老师 其实我觉得没必要对比每一个考研数学老师&#xff0c;汤家凤还有张宇以及武忠祥都是非常受欢迎的老师&#xff0c;也都很有实力&#xff0c;只不过讲课的风格有所区别。 比如汤家凤老师就像是高中那种不苟言…

2024华为产业链企业名单大全(附下载)

更多内容&#xff0c;请前往知识星球下载&#xff1a;https://t.zsxq.com/18fsVdcjA 更多内容&#xff0c;请前往知识星球下载&#xff1a;https://t.zsxq.com/18fsVdcjA

mapbox测距功能重写

// 使用 import MeatureTool from "/components/webgisMap/measureTool";measureDistance() {// ID可以自定义const layerId String(new Date().getTime())this.meatureTool new MeatureTool(this.mapBoxMap)this.meatureTool.measureDistance(layerId)// 防止函数…

动态内存管理-传值调用错题解析

首先我们来看这个错误代码 首先我们看代码逻辑&#xff0c;首先main函数调用test&#xff0c;test接收的是void类型&#xff0c;设置一个指针变量&#xff0c;指向null&#xff0c;传递给get函数&#xff0c;也就是传递一个空指针给getmemory函数&#xff0c;这个函数接收了&a…

单片机入门到精通:一站式在线学习平台!

介绍&#xff1a;单片机&#xff0c;也称为微控制器&#xff08;MCU&#xff09;&#xff0c;是一种集成了中央处理器&#xff08;CPU&#xff09;、随机存储器&#xff08;RAM&#xff09;、只读存储器&#xff08;ROM&#xff09;以及输入/输出接口于单一芯片上的微型计算机。…

设计模式学习笔记 - 设计模式与范式 -结构型:2.桥接模式:如何实现支持不同类型和渠道的消息推送系统?

概述 今天学习另外一种结构型模式&#xff1a;桥接模式。桥接模式的代码实现非常简单&#xff0c;但是理解起来稍微优点难度&#xff0c;并且应用场景也比较局限&#xff0c;所以&#xff0c;相对于代理模式来说&#xff0c;桥接模式在实际的项目中并没有那么常用&#xff0c;…

Spring文件配置以及获取

前言 我们都知道很多应用都是有配置文件的,可以对应用的一些参数进行配置,如conf... 本篇我们讲解关于Spring的配置文件以及程序怎么获取其中写入的参数 Spring中的配置文件主要有三种 还有yml和ymal文件 下面我们将介绍关于常用的两种 preoperties 和 yml文件的格式和读取…

2024年适合个人和普通企业用户的阿里云服务器推荐,最低仅需61元1年

现在不论是个人还是企业&#xff0c;只要有建站&#xff0c;做APP&#xff0c;存储数据等需要就需要一台云服务器。通常来说&#xff0c;购买阿里云服务器的用户主要分为三类&#xff1a;一是个人用户&#xff0c;二是普通企业用户&#xff0c;三是对云服务器性能有特殊需求的集…

libVLC 视频缩放

libvlc是一个常用的开源多媒体框架&#xff0c;它可以用来播放和处理各种类型的音频和视频文件。如果想要缩放视频&#xff0c;可以通过libvlc提供的API来实现。 //设置视频的缩放比例。 libvlc_video_set_scale() 以下是如何使用 libVLC 设置视频缩放的基本步骤&#xff1a;…

【研发管理】研发管理规范

研发管理规范 目的定义工作职责产品经理项目经理运维负责人研发负责人研发工程师 基本原则研发过程描述需求分析分析设计研发实现测试验收发布上线线上监控 目的 软件研发相关管理&#xff0c;有效控制技术风险&#xff0c;提高研发和运行质量 定义 包括需求分析、分析设计…

智慧公厕的全域感知、全网协同、全业务融合和全场景智慧赋能

公共厕所是城市的重要组成部分&#xff0c;为市民提供基本的生活服务。然而&#xff0c;传统的公厕管理模式存在诸多问题&#xff0c;如排队等候时间长、卫生状况差、空气质量差等&#xff0c;严重影响市民的出行和生活质量。为了解决这些问题&#xff0c;智慧公厕应运而生&…