首先在 GitHub Settings 创建 OAuth Application
。
创建完成之后,能够获取到 client_id
和 client_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')
})