• 如何接入易班第三方登录


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

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

    易班

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

    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

  • 相关阅读:
    深入探究分布式锁
    Java的类加载器有几种?什么是双亲委派机制?
    Java的Arrays.sort()方法到底用的什么排序算法
    什么是SPI
    Go语言学习笔记(八)golang 操作 Redis & Mysql & RabbitMQ
    Go语言学习笔记(七)杀手锏 Goroutine + Channel
    Go语言学习笔记(六)net & net/http
    Go语言学习笔记(五)文件操作
    Go语言学习笔记(四)结构体struct & 接口Interface & 反射reflect
    Go语言学习笔记(三)数组 & 切片 & map
  • 原文地址:https://www.cnblogs.com/bay1/p/10982484.html
Copyright © 2020-2023  润新知