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

发布于:2024-05-03 ⋅ 阅读:(25) ⋅ 点赞:(0)

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

前言

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

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

OAuth

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

Auth.js支持的Oauth集成方式

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

开始

引入GitHub Providers

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

image.png

添加环境变量

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

image.png

在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/] 

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

image.png

编写Github登录

登录方法

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

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文件

'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登录按钮。

image.png

编写GitHub回调页面

如果你刚刚留意到GitHub OAuth App配置中设置了 的回调地址,所以要对应的编写这个页面,按照路径创建api\auth\callback\github\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登录回调返回案例:

需要使用code访问:

获取accessToken后访问以下接口:

image.png

验证

运行项目,进入, 自动跳转至登录页面

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

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

使用code调用accessToken接口

image.png

获取用户信息

参考(Reference)

Auth.js文档:

Github Api文档:

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


网站公告

今日签到

点亮在社区的每一天
去签到