oAuth授权之github

267 阅读1分钟

OAuth

OAuth 2.0 是目前最流行的授权机制,用来授权第三方应用,获取用户数据。OAuth协议为用户资源提供了一个安全的、开放而又简易的标准。与以往的授权方式不同的是OAuth授权不会使第三方触及到用户的用户名和密码,即第三方无需使用用户的用户名和密码就可以申请获得该用户资源的授权,因此OAuth是安全的。

github -- oAuth 验证登录

验证过程

客户端发起认证请求——>服务端重定向到github认证——>调用github认证——>回调返认证code给服务端——>服务端用code向github申请令牌——>github返回令牌给服务器——>服务器携带令牌获取用户资源

详细过程参考官方文档

github设置

  • 登录github找到Settings
  • 选择Developer settings
  • 选择OAuth Apps ——> 第一次没有配置需要 New OAuth App
  • 创建完成后会生成Client ID、Client Secret,配置Homepage URL和 Authorization callback URL

node代码

const Koa = require('koa')
const Router = require('koa-router')
const static = require('koa-static')
const axios = require('axios')
const querystring = require('querystring')

const app = new Koa()
const router = new Router()
app.use(static(__dirname + '/'));
const config = {
    client_id : 'xxxxx',	//上图生成的Client ID
    client_secret : 'xxxx'	//上图生成的Client Secret
}
router.get('/github/login',async ctx => {
    // 重定向到认证接口,并配置参数
    let datastr = (new Date()).valueOf();
    let path = `https://github.com/login/oauth/authorize?${querystring.stringify({client_id:config.client_id})}`;
    // 转发到授权服务器
    ctx.redirect(path)
})

router.get('/github/oauth/callback',async ctx => {
    // 拿到code
    const code = ctx.query.code;
    const params = {
        client_id : config.client_id,
        client_secret : config.client_secret,
        code : code
    }
    // 拿着code 请求token
    let res = await axios.post('https://github.com/login/oauth/access_token',params)
    // 获得token
    const access_token = querystring.parse(res.data).access_token
    console.log(access_token)
    // 刷新页面
    res = await axios.get('http://api.github.com/user?access_token=' + access_token)
    console.log('userInfo:',res.data)
    ctx.body = `<h1>hello ${res.data.login}</h1>
    <img src="${res.data.avatar_url}" />
    `
})

app.use(router.routes());
app.use(router.allowedMethods());
app.listen(7001,() => {
    console.log('7001端口已开启')
})