介于公司内部软件需要做钉钉统一登录。
主要的逻辑流程:
二话不说,上代码(由python去实现)
URL_ACCESS_TOKEN = 'https://oapi.dingtalk.com/sns/gettoken?appid=XXXXXXXXXXXXXXX&appsecret=XXXXXXXXXXXXXXXXXXXX' URL_TMP_AUTH_CODE = 'https://oapi.dingtalk.com/sns/get_persistent_code?access_token='
def login(request): body = json.loads(request.body.decode()) #获取前端传入的参数dingcode ding_code = body.get('ding_code') if not ding_code: return Response(data={'code': -1, 'msg': '传入正确的参数。', 'data': {}}, status=401) #URL_ACCESS_TOKEN获取token的url,获取token res = requests.get(URL_ACCESS_TOKEN) data = { 'tmp_auth_code': ding_code, } headers = { 'Content-Type': 'application/json', } url_tmp_auth_code = URL_TMP_AUTH_CODE + json.loads( res.text).get('access_token') #url_tmp_auth_code钉钉获取用户unionid的接口,通过token和dingcode req = requests.post(url_tmp_auth_code, headers=headers, json=dict(data)) unionid = json.loads(req.text).get('unionid') print(unionid) try: #通过unionid去数据库中获取对应的用户信息 user = Users.objects.get(unionid=unionid) except: return Response(data={'code': -1, 'msg': '用户没有登陆权限。', 'data': {}}, status=401) if user.is_active != 1: return Response(data={'code': -1, 'msg': '用户没有登陆权限。', 'data': {}}, status=401) #做登录操作 login(request, user) print(request.user.unionid) request.session['is_login'] = True request.session['FS_YWPT'] = True request.session.set_expiry(0) return Response(data={'code': 1,'msg': '获取成功','data': {'username': user.username}})
python后端是有django去实现的,这里做了登录的接口实现。