首先,我们要知道企业微信网页授权登录的原理。
企业微信提供了OAuth的授权登录方式,可以让从企业微信终端打开的网页获取成员的身份信息,从而免去登录的环节。
企业应用中的URL链接(包括自定义菜单或者消息中的链接),均可通过OAuth2.0验证接口来获取成员的UserId身份信息。
最开始,我们需要在Flask App中定义参数:
WECHAT_CORP_ID = '你的企业ID'
WECHAT_CORP_SECRET = '你的应用Secret'
WECHAT_REDIRECT_URI = '你的登录URL' # 例如 http://gongzk.com/callback
# 引入 from flask_caching import Cache
cache = Cache(app)
而后,定义一个统一返回函数:
# 引入 from flask import Flask, request, jsonify
def Result(code=500,message='error',data=[]):
json_dict = {
'code':code,
'message':message,
'data':data
}
return jsonify(json_dict)
构造企业微信网页授权登录链接函数:
@app.route('/api/wework/oauth')
def wechat_login():
url = request.args.get('url')
wechat_auth_url = (
f"https://open.weixin.qq.com/connect/oauth2/authorize"
f"?appid={WECHAT_CORP_ID}"
f"&redirect_uri={WECHAT_REDIRECT_URI}"
f"&response_type=code"
f"&scope=snsapi_userinfo"
f"&state={url}#wechat_redirect"
)
return Result(500,"获取成功",wechat_auth_url)
获取企业微信Access Token函数:
def get_wechat_access_token():
token = cache.get('wechat_access_token')
if token is None:
token_url = (
f"https://qyapi.weixin.qq.com/cgi-bin/gettoken"
f"?corpid={WECHAT_CORP_ID}&corpsecret={WECHAT_CORP_SECRET}"
)
response = requests.get(token_url).json()
token = response.get('access_token')
if token:
# 注意 Access Token 不可大量请求,需在本地缓存 7200 秒
cache.set('wechat_access_token', token, timeout=7200)
return token
最后,从数据库中找到相应用户返回 JWT Token:
@app.route('/api/wework/callback')
def wechat_callback():
code = request.args.get('code')
if not code:
return jsonify({"code": 500, "message": "找不到参数"})
# 获取 access_token
access_token = get_wechat_access_token()
if not access_token:
return jsonify({"code": 500, "message": "参数获取失败"})
userinfo_url = (
f"https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo"
f"?access_token={access_token}&code={code}"
)
userinfo_response = requests.get(userinfo_url).json()
user_id = userinfo_response.get('UserId')
if not user_id:
return jsonify({"code": 500, "message": "用户信息错误"})
# 根据 user_id 查找或创建用户
user = User.query.filter_by(username=user_id).first()
if not user:
return Result(500,"用户不存在系统中")
# 生成 JWT Token
userInfo = {
"username": user.username,
"name": user.name,
"phone": user.phone,
"gender": user.gender,
"id_card": user.id_card,
"license_plate": user.license_plate
}
access_token = create_access_token(identity=user_id, expires_delta=timedelta(minutes=10080))
return Result(200,"登录成功",{"token":access_token,"userInfo":userInfo})