作为一名前端开发学员,必要的后端知识还是要会一些的,最直接的最基础的就是登录的实现了。这里就以GitHub为例,首先就是去GitHub官网设置必要的信息了,过程如下:打开官网登录自己的账号:打开 Setting -> Developer setting

 -> OAuth applications ->点击 Register a new application ->设置Application name、Homepage URL、Application description、Authorization callback URL。更详细的过程可参考官方文档。上一段图吧,更加直观。如下:

   

其中属于我的个人客户端数据被擦除了一些,想实现的朋友可以使用自己的;

接下来慢慢实现了,目前来说很多大型网站都支持第三方登录了,作为一个程序员上GitHub的频率算高了,这里就以GitHub为例。而说到第三方登录,就不得不说到Oauth了,OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。这个协议需要客服端提交的数据和服务提供方(GitHub)的数据进行匹配,正确且授权就能通过,其OAuth 协议的登录和授权的过程如下:A、客户端将用户导向认证服务器;B、用户决定是否给予客户端授权;C、如果用户授权,认证服务器将用户导向客户端指定的重定向URI,并在URI的hash部分给出code;D、浏览器向资源服务器发出请求,申请令牌;E、得到令牌 拿着令牌做操作。

上一段代码:

const router = require('koa-router')()
const config = require('../config')
const fetch = require('node-fetch')
const routes = router    
    .get('/login', async (ctx) => {
        // 去到github授权页
        const dataStr = (new Date()).valueOf();
        var path = 'https://github.com/login/oauth/authorize';
        path += '?client_id=' + config.client_id;
        path += '&scope=' + config.scope;
        path += '&state=' + dataStr;
        console.log(path)
        // authorize 授权 (注册/申请)一下我们的应用
        ctx.redirect(path)  // 送到授权的中间页
    })
    .get('/oauth/callback', async (ctx) => {
        const code = ctx.query.code
        let path = 'https://github.com/login/oauth/access_token';
        const params = {
            client_id: config.client_id,
            client_secret: config.client_secret,
            code: code
        }
        await fetch(path, {
            // 没有fetch,需要装node-fetch
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify(params)
        })
        .then(res => {
            // console.log(res)
            return res.text()    // 获得到的是一个二进制流,转换成文本
        })
        .then(body => {
            const args = body.split('&');
            let arg = args[0].split('=');
            const access_token = arg[1];
            console.log(access_token);
            return access_token;
        })
        .then(async(token) => {
            const url = 
            'https://api.github.com/user?access_token=' + token // token就是oauth令牌环
            console.log(url)
            await fetch(url)
                .then(res => {
                    return res.json()
                })
                .then(res => {
                    console.log(res)
                    ctx.body = res
                })
        })
    })

module.exports = routes;复制代码

其中配置页代码如下:

module.exports = {    
'client_id': '1fc534c9a4*************',    
'client_secret': 'f5380d4*****************aeb2027ac87b6dc6',    
'scope': ['user']  // 授权范围
}复制代码

最后再上一波效果图:

 

完整代码详见本人GitHub

其中的流程就是客户端:提交数据给GitHub进行验证,验证通过再继续授权,申请得到一个令牌,得到令牌就可以做接下的别的操作了,同时令牌超过一段时间,令牌环失效,失效之后需重新更新。