Loading

如何接入易班第三方登录

工作室接手易班,免不了的要在他的平台上做些事情,第一次去实现第三方登录应用
记录下(实际为了填博客)

首先一句话总结方法吧:看文档.........
感觉每个第三方调用使用都是差不多的

易班

这是官方给出的易班授权的流程图
看来我之后我们应该能很明白我们要做两件事情:

  1. 获取授权令牌
  2. 通过授权令牌获取授权凭证

当得到授权凭证,我们就能通过授权凭证改进
我们原本鉴权以适应第三方登录
官方原理就不重复了,只是展示一下实践过程的代码

获取授权令牌

Getcode_baseurl = 'https://oauth.yiban.cn/code/html?client_id='

# 重定向登录页面
@oauth.route('/login', methods=['GET'])
def redirect_codeurl():
    getcode_url = Getcode_baseurl + current_app.config['APPID']+'&redirect_uri=' + \
        current_app.config['REDIRECT_URI'] + \
        '&state='+current_app.config['STATE']
    return redirect(getcode_url)

首先我们获取第一步需要的授权令牌
由易班文档我们可以设置用户点击易班登录的时候
把用户重定向到授权页面,即用户访问/api/yiban/login用flask中redirect
重定向到getcode_url
用户同意授权后,会被重定向到我们管理后台设置的callback地址
并携带授权令牌code,即:

127.0.0.1 - - [04/Apr/2018 17:56:34] "GET /api/yiban/callback?code=846b11408419865fea4365f473b103eef4410cda&state=asdnajisdnajfbnjsk HTTP/1.1" 200 -

获取授权凭证

@oauth.route('/callback', methods=['GET'])
def redirect_tokenurl():
    code = request.args.get('code')
    gettoken_url = Gettoken_baseurl + code + '&client_id=' + \
        current_app.config['APPID'] + '&client_secret=' + current_app.config['APPSECRET'] + \
        '&redirect_uri='+current_app.config['REDIRECT_URI']
    try:
        result_json = requests.get(gettoken_url).json()
    except expression as identifier:
        return jsonify({'code': 500, 'msg': "服务端发生错误"})
    if 'code' in result_json.keys():
        return jsonify(result_json)
    else:
        payload = {
            'client_id': current_app.config['APPID'],
            'access_token': result_json['access_token']
        }
        check_token = requests.post(
            'https://openapi.yiban.cn/oauth/token_info', payload).json()
        if check_token['status'] == 404:
            return jsonify({'code': 404, 'msg': "令牌已过期"})
        check_admin = Admin.query.filter_by(
            id=result_json['userid']).first()
        if check_admin:
        	check_admin.access_token = result_json['access_token']
        	db.session.add(check_admin)
            token = check_admin.generate_auth_token()
        else:
            admin = Admin(id=result_json['userid'],
                          access_token=result_json['access_token'],
                          expires=result_json['expires'])
            db.session.add(admin)
            token = admin.generate_auth_token()
        db.session.commit()
    return jsonify({'code': 200, 'msg': "登录成功", 'token': token.decode('ascii')})

接下里我们要做的也很明显,就是通过上一步得到的授权令牌来进一步获取授权凭证
首先用户同意授权会被重定向到/api/yiban/callback
我们通过获取url中的code进一步request获取凭证的链接就可以完成
然后我们怎么和原本的用户鉴权结合呢??

首先每个项目你所用的鉴权方式可能不一样
这里我使用了第三方库flask_httpauth

这个方式的鉴权是获取填写的用户名和密码或者是你POST
过来的token,然后通过验证用户名和密码或者解密token来实现鉴权
也就是如果我们使用第三方登录,只需要保存或者更新token到对应的第三方用户表段就行了
再进行其他路由访问的时候携带token就行了
(当然你要拓展用户表表段以适应第三方登陆的保存)

yiban
yiban

posted @ 2018-04-04 17:40  bay1  阅读(1434)  评论(0编辑  收藏  举报