refactor: 重构飞书授权代码,提取公共工具类

1. 创建 app/util/HttpClient.php
   - 公共 HTTP 请求类
   - httpGet() 和 httpPost() 方法
   - 支持自定义 headers 和 timeout
   - 统一错误处理和日志

2. 创建 app/util/FeishuUtil.php
   - 飞书授权工具类,可被其他业务模块复用
   - getAppAccessToken() - 获取应用访问令牌(带缓存)
   - getUserAccessToken() - 获取用户访问令牌
   - getUserInfo() - 获取用户信息
   - getCompleteUserInfo() - 一步获取完整用户信息
   - clearTokenCache() - 清除 token 缓存

3. 重构 app/service/FeishuService.php
   - 使用新的工具类
   - 移除重复的 HTTP 请求方法
   - 保持向后兼容

飞书授权流程:
1. app_access_token (应用级令牌)
2. user_access_token (用户级令牌,需要 app_access_token)
3. 用户信息 (需要 user_access_token)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
root
2026-02-26 10:43:29 +08:00
parent b1d58ece61
commit 6899bad529
5 changed files with 398 additions and 145 deletions
+7 -4
View File
@@ -142,7 +142,8 @@ class AuthController extends BaseController
// 构建扫码登录 URL(使用官方 passport 端点)
$appId = 'cli_a8033d607cba500d';
$redirectUri = urlencode("https://xsm.dev.hnxinyouhe.com/login/qrcode/{$loginSession->id}");
// 使用固定的 redirect_uri,session_id 通过 state 传递
$redirectUri = urlencode("https://xsm.dev.hnxinyouhe.com/login/callback");
$authUrl = "https://passport.feishu.cn/suite/passport/oauth/authorize?client_id={$appId}&redirect_uri={$redirectUri}&response_type=code&state={$loginSession->id}";
// 生成二维码内容(返回 URL,前端生成二维码)
@@ -216,10 +217,12 @@ class AuthController extends BaseController
/**
* 飞书扫码登录回调(飞书授权后的回调)
*/
public function qrcodeLoginCallback(Request $request, $id = null): Response
public function qrcodeLoginCallback(Request $request): Response
{
$sessionId = $id;
$authCode = $request->get('auth_code');
// 从 state 参数获取 session_id
$sessionId = $request->get('state');
// OAuth 2.0 标准参数是 code
$authCode = $request->get('code');
if (!$sessionId) {
return $this->error('缺少会话ID');