前言
创建OAuth App
- 首先,你需要拥有一个github账户
- 通过通过点击右上角头像的 Settings → Developer settings → OAuth Apps 进入到 OAuth Apps 页面
- 点击New OAuth App按钮 创建新的OAuth App
- 具体创建过程我就不在此赘述了,相关步骤可以看我附在结尾的文章,本篇重点在于nextjs+vercel环境下的配置
配置环境变量
- OAuth App的使用需要配置github的client_id,client_secret以及一个回调地址
- 因此我们需要三个环境变量
- NEXT_PUBLIC_GITHUB_CLIENT_ID // client id
- GITHUB_CLIENT_SECRET // client secret
- NEXT_PUBLIC_GITHUB_REDIRECT_URL // 回调地址
- 其中client_id和回调地址在前端调取时会用到,所以被设置为了客户端环境变量
- 而client secret是用于使用OAuth Apps的秘钥,所以只需配置在服务端,避免在客户端被泄露
- 在项目中使用时,通过process.env来访问即可,如process.env.NEXT_PUBLIC_GITHUB_CLIENT_ID
登录流程
- 首先,前端登录需要跳转到对应的链接,去进行github方面的授权
- 链接如下
${authorize_uri}?client_id=${client_id}&redirect_url=${redirect_url}
- authorize_uri为https://github.com/login/oauth/authorize github授权的地址
- client_id就是上文所说的NEXT_PUBLIC_GITHUB_CLIENT_ID
- redirect_url为上文所说的NEXT_PUBLIC_GITHUB_REDIRECT_URL,用于github授权后回调的地址,本项目则是配置了专门的一个页面,用于处理github授权后的回调
- 授权成功后,github会回调到redirect_url,并携带一个code参数,用于获取用户信息
- 跳转后再页面中处理,携带code参数请求后端接口
- 后端接口通过code参数请求github的接口,来获取用户token,后续我们就可以通过这个token,来获取访问用户信息的权限
- 对应接口为
https://github.com/login/oauth/access_token?client_id=${client_id}&code=${code}&client_secret=${client_secret}
,需要戴上code,client_id以及client_secret
- 成功调取后,会返回一个token,我们再拿着这个token去请求github获取用户信息的接口
- 接口为
https://api.github.com/user
- 不要忘记在这个接口的请求头里带上对应的token,我这边使用的是axios库来发起请求,写法如下
const userUrl = `https://api.github.com/user`
const headers = {
'Authorization': `Bearer ${token}`,
'Accept': 'application/json, text/plain, */*',
}
const userInfo = await axios.get(
userUrl,
{
headers: headers
}
)
- 拿到用户信息后,我们就可以在自己的系统里处理这些信息了,整个登录流程也完成了
配置跳转页面
- 我这边的方案是创建一个用于登录的页面,专门用于处理github与其它未来可能的平台第三方登录
- 很简单,写一个能呈现加载状态的页面,将其设置为客户端页面,使用useEffect钩子,使其在页面挂载时去请求接口即可,在此就不多赘述了
参考文章
GitHub OAuth 第三方登录示例教程