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...

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

相关推荐
阿伟来咯~29 分钟前
记录学习react的一些内容
javascript·学习·react.js
吕彬-前端34 分钟前
使用vite+react+ts+Ant Design开发后台管理项目(五)
前端·javascript·react.js
学前端的小朱37 分钟前
Redux的简介及其在React中的应用
前端·javascript·react.js·redux·store
guai_guai_guai1 小时前
uniapp
前端·javascript·vue.js·uni-app
bysking2 小时前
【前端-组件】定义行分组的表格表单实现-bysking
前端·react.js
王哲晓2 小时前
第三十章 章节练习商品列表组件封装
前端·javascript·vue.js
fg_4112 小时前
无网络安装ionic和运行
前端·npm
理想不理想v2 小时前
‌Vue 3相比Vue 2的主要改进‌?
前端·javascript·vue.js·面试
酷酷的阿云2 小时前
不用ECharts!从0到1徒手撸一个Vue3柱状图
前端·javascript·vue.js
微信:137971205872 小时前
web端手机录音
前端