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_ID、AUTH_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...

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

相关推荐
brien941 分钟前
为什么模型标称 1M,Google Antigravity 聊到 256K 却突然失忆?我们给它做了个原生行内监控圆环
前端
修炼的dance1 小时前
录屏关键帧间隔多少合适?六档实测,2秒到10秒小了75.6%
前端
Lank_M1 小时前
关键帧从1秒拉到10秒,录屏小87.3%,摄像头小10.8%
前端
补码缩写1 小时前
用 ffprobe 拆录屏,八成字节在 29 个关键帧上
前端
百思不得小李1 小时前
一个复杂的动态表单是如何实现的
前端·设计模式
陈随易1 小时前
Cmder 停更 17 个月,2.0 支持 Windows Terminal
前端·后端·程序员
风骏时光牛马2 小时前
前沿视界
前端
kyriewen2 小时前
我扫了 814 个依赖,97 个还敢要 Node 10
前端·javascript·程序员
陈随易2 小时前
3000 万人在用的翻译插件,重写一遍就是一门生意
前端·后端·程序员
IT_陈寒2 小时前
Vue的这个响应式陷阱,差点让我加班到天亮
前端·人工智能·后端