工作室接手易班,免不了的要在他的平台上做些事情,第一次去实现第三方登录应用
记录下(实际为了填博客)
首先一句话总结方法吧:看文档.........
感觉每个第三方调用使用都是差不多的
这是官方给出的易班授权的流程图
看来我之后我们应该能很明白我们要做两件事情:
- 获取授权令牌
- 通过授权令牌获取授权凭证
当得到授权凭证,我们就能通过授权凭证改进
我们原本鉴权以适应第三方登录
官方原理就不重复了,只是展示一下实践过程的代码
获取授权令牌
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就行了
(当然你要拓展用户表表段以适应第三方登陆的保存)