Next 14引入Auth.js实现GitHub OAuth2.0登录

本文皆为个人原创,请尊重创作,未经许可不得转载。

前言

之前写了一篇有关Next和Auth.js的文章《Next.js 14 引入NextAuth.js,实现登录认证用户信息获取》,阐述了如何在Next 14 中引入Auth并配置,感兴趣的朋友可以点击跳转

本篇文章提到的项目已上传GitHub托管,感兴趣可点个Star~

OAuth

OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的账号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。oAuth是Open Authorization的简写。

Auth.js支持的Oauth集成方式

Auth.js预配置了超过80个Providers,不断进行测试的、流行的有20多种,其中包括今天需要引入到项目的GitHub登录。

开始

引入GitHub Providers

打开项目中auth.js文件,在providers中添加GitHub

添加环境变量

在app同级目录下.env文件中加入如下内容

在GitHub中注册OAuth app信息

打开你的GitHub页面,进入setting -> Developer Settings,点击New OAuth App创建此项目的OAuth信息。

添加GitHub Oauth信息,注意Authorization callback URL项。

Auth.js官方文档原文提到The default callback URL should generally take the form of [origin]/api/auth/callback/[provider], however, the default is slightly different depending on which framework you're using.

简要意思就是需要设置 [origin] [provider] 两个地方, [provider] 在此处是github ,而我们的 [origin] 对应的就是我们的项目地址[http://localhost:3000/]

点击Register application,得到Client ID,再手动生成一个Client secrets,回填到我们项目.env文件中AUTH_GITHUB_IDAUTH_GITHUB_SECRET

编写Github登录

登录方法

lib/action.ts下编写新的Oauth Provider登录方法,传输Provider id到我们auth.ts中的signIn方法中调用对应的OAuth登录逻辑(Auth.js已经写好对应的逻辑)

action.ts 复制代码
export async function SignWithProvider( pervState: LoginState | undefined,
  formData: FormData): Promise<LoginState>  {
  const providerData : any | null = formData.get('provider');
  const provider : LiteralUnion<string> = providerData ?  providerData as string : ''
  console.log('debug issues-02:',provider);
  const result = await signIn(provider)
  console.log('debug issues-03:',result);
  return {
    success: true,
    errorMsg: null
  }
}

创建一个通用的Providers按钮

接收页面组件传来的动态传给SignWithProvider方法,创建common/SignInButton.tsx文件

SignInButton.tsx 复制代码
'use client'
import { useFormState,useFormStatus } from 'react-dom';
import { SignWithProvider } from '../lib/action';
const initState = {
  errorMsg: "",
  success: false
};

export default function ProviderSignInButton({provider} : {provider?: string}) {
  const [state, dispatch] = useFormState(SignWithProvider, initState);
  const { pending } = useFormStatus();
  return (
    <>
    <form action={dispatch}
    >
      <input name='provider' style={{display:'none'}} defaultValue={provider}></input>
      {state?.errorMsg && <p> {state.errorMsg} </p>}
      <button type="submit" aria-disabled={pending}>Sign With {provider}</button>
    </form>
   </>
  )
    
};

登录页面加入github登录按钮

在之前的login/page.tsx登录页面中加入刚刚写好的Provider登录按钮。

编写GitHub回调页面

如果你刚刚留意到GitHub OAuth App配置中设置了http://localhost:3000/api/auth/callback/github/ 的回调地址,所以要对应的编写这个页面,按照路径创建api\auth\callback\github\page.tsx

page.tsx 复制代码
'use client'

import { useSearchParams } from "next/navigation"

export default function page() {
  const param = useSearchParams()
  return(
    <div style={{margin:'auto'}}>
    <p style={{padding: 30}}> this is github call back! {param.get('code')}</p>
    </div>
  )
};

编写GitHub API调用

Github登录成功回调之后,github服务端会在回调路径中回调code参数,使用code作为获取accessToken的凭证再获取到用户的信息。

由于我常常调用接口超时,所以此处不进行展示。

github登录回调返回案例:http://localhost:3000/api/auth/callback/github?code=822a62a312a71f092782

需要使用code访问: github.com/login/oauth...

获取accessToken后访问以下接口:

验证

运行项目,进入http://localhost:3000/home, 自动跳转至登录页面

点击Sign With github,需要登录授权

登录后跳转到回调页面并展示返回的code

使用code调用accessToken接口

获取用户信息

参考(Reference)

Auth.js文档: authjs.dev/guides/conf...

Github Api文档:docs.github.com/en/rest/use...

本文皆为个人原创,请尊重创作,未经许可不得转载。

相关推荐
石小石Orz6 小时前
我发现了开发者AI产品营收的新方向
前端·虚拟现实
老马识途2.06 小时前
关于跨域问题的总结
java·前端
别惊醒渔人8 小时前
Vue3 Diff 优化:最长递增子序列 LIS
前端·javascript·vue.js
颜酱8 小时前
07 | 把字段与指标同步到 Qdrant(生成阶段)
前端·人工智能·后端
用户059540174468 小时前
把AI长期记忆测试从手动验证换成pytest,2天揪出11个隐藏Bug
前端·css
lichenyang4539 小时前
从 Vite 空项目到 AIGC 图片工作台:我如何打通生图、任务轮询、生成库与 Canvas 动态特效
前端·人工智能
泡沫冰@9 小时前
上章节中文件的讲解
前端·网络·nginx
进击的丸子10 小时前
APP人脸识别增值版Harmony Demo实操与关键代码解析
前端·程序员·harmonyos
a11177610 小时前
唯美花朵风格的黑胶唱片音乐播放器
前端·css·css3
Hilaku10 小时前
工作 5 年后,决定你薪资上限的究竟是什么?
前端·javascript·程序员