Skip to content

首先在 GitHub Settings 创建 OAuth Application

创建完成之后,能够获取到 client_idclient_secret

根据 GitHub OAuth Docs 所述,可创建如下 express 应用:

js
const express = require('express')
const axios = require('axios')
const { clientId, clientSerect } = require('./serect.js')
const app = express()

// 获取code
const githubAuthURL = 'https://github.com/login/oauth/authorize'
// 获取access_token
const githubTokenURL = 'https://github.com/login/oauth/access_token'
// 获取用户信息
const githubUserURL = 'https://api.github.com/user'

app.get('/', (req, res) => {
  res.send('<a href="/oauth/login" target="_self">Github授权</a>')
})

// 点击授权
app.get('/oauth/login', (req, res) => {
  res.redirect(`${githubAuthURL}?client_id=${clientId}`)
})

// 授权回调地址
app.get('/oauth/callback_url', async (req, res) => {
  const { query } = req
  const { code } = query
  if (!code) {
    res.send(query)
    return
  }
  try {
    const tokenResult = await axios.post(githubTokenURL, {
      client_id: clientId,
      client_secret: clientSerect,
      code
    }, {
      headers: {
        Accept: 'application/json'
      }
    })
    const { data: tokenData } = tokenResult
    const { access_token: accessToken } = tokenData
    if (accessToken) {
      const userInfo = await axios.get(githubUserURL, {
        headers: {
          Authorization: `Bearer ${accessToken}`
        }
      })
      const { data: userInfoData } = userInfo
      res.send(userInfoData)
    } else {
      res.send({
        url: githubTokenURL,
        ...tokenData
      })
    }
  } catch(e) {
    res.send(e)
  }
})

app.listen(3000, err => {
  console.log('http://localhost:3000')
})