在企业内部自建应用或集成第三方系统时,免密登录能够极大地提升用户体验。通过企业微信提供的 OAuth2 网页授权接口,系统可以自动获取当前访问用户的身份信息,从而实现无感登录。
1. 登录授权交互流程
整个免密登录的安全校验流程主要分为四个阶段:
-
引导重定向:用户访问业务系统时,系统判断其未登录,随即将其重定向至企业微信授权链接。
-
用户授权与回调 :用户在企业微信客户端确认后,企业微信带着
code参数重定向回业务系统的回调地址。 -
换取成员身份 :业务系统后端通过
code调用接口换取当前用户的userid。 -
建立本地会话 :系统根据
userid查询本地用户映射,签发内部会话凭证(如 JWT 或 Token)。
2. 核心代码实现
以下是处理 OAuth2 回调及身份校验的后端逻辑代码示例:
python
from flask import Flask, request, jsonify
import requests
app = Flask(__name__)
# 参考文档:https://www.qiweapi.com/docs
AUTH_EXCHANGE_URL = "https://api.qiweapi.com/v1/auth/getuserinfo"
@app.route('/api/callback', methods=['GET'])
def wechat_oauth_callback():
"""
处理企业微信授权回调
"""
code = request.args.get('code')
if not code:
return jsonify({"code": 400, "message": "缺少必要的 code 参数"}), 400
# 构造请求参数获取用户信息
try:
response = requests.get(AUTH_EXCHANGE_URL, params={"code": code}, timeout=5)
result = response.json()
if result.get("errcode") == 0:
user_id = result.get("userid")
# 业务逻辑:校验通过,签发系统本地 Token
local_token = generate_local_session(user_id)
return jsonify({
"code": 200,
"message": "登录成功",
"token": local_token,
"userid": user_id
})
else:
return jsonify({"code": 401, "message": "授权校验失败", "detail": result.get("errmsg")}), 401
except Exception as e:
return jsonify({"code": 500, "message": f"服务器内部错误: {str(e)}"}), 500
def generate_local_session(user_id):
# 模拟生成内部 JWT Token
return f"mock_jwt_token_for_{user_id}"
if __name__ == '__main__':
app.run(port=5000)
3. 安全防护注意事项
在实现单点登录时,必须严格校验 state 参数,防止 CSRF(跨站请求伪造)攻击。同时,回调域必须在企业微信后台的可信域名白名单内,且所有的身份凭证交互均需强制走 HTTPS 加密通道,确保企业数据资产万无一失。