-- Gitea OAuth Provider -- 使用完整的Lua API功能 -- 1. 生成授权URL function auth_url(cfg, state) log.info("Gitea: 生成授权URL, state=%s", state) -- 构建查询参数 local params = { "client_id=" .. util.url_encode(cfg.client_id), "redirect_uri=" .. util.url_encode(cfg.redirect_uri), "response_type=code", "scope=read:user", "state=" .. util.url_encode(state) } -- 拼接URL local url = cfg.base_url .. cfg.authorize_url .. "?" .. table.concat(params, "&") log.debug("Gitea: 授权URL生成完成") return url end -- 2. 交换授权码获取访问令牌 function exchange(cfg, code) log.info("Gitea: 开始交换授权码获取访问令牌") -- 准备请求数据 local data = { client_id = cfg.client_id, client_secret = cfg.client_secret, code = code, grant_type = "authorization_code", redirect_uri = cfg.redirect_uri } local url = cfg.base_url .. cfg.token_url log.debug("Gitea: 请求token URL: %s", url) -- 发送POST请求 local resp, err = http.post(url, data, { Accept = "application/json" }) if err then log.error("Gitea: 获取token失败: %s", err) return nil, err end -- 检查响应 if not resp.access_token then log.error("Gitea: 响应中没有access_token") log.debug("Gitea: 响应内容: %s", json.encode(resp)) return "" end log.info("Gitea: 成功获取访问令牌") return resp.access_token end -- 3. 获取用户信息 function user_info(cfg, token) log.info("Gitea: 开始获取用户信息") local url = cfg.base_url .. cfg.user_url log.debug("Gitea: 请求用户信息URL: %s", url) -- 发送GET请求 local resp, err = http.get(url, { Authorization = "Bearer " .. token, Accept = "application/json" }) if err then log.error("Gitea: 获取用户信息失败: %s", err) return nil, err end -- 验证响应 if not resp.id then log.error("Gitea: 用户信息响应格式错误") log.debug("Gitea: 响应内容: %s", json.encode(resp)) return {} end log.info("Gitea: 成功获取用户信息, 用户名=%s", resp.login or "unknown") -- 返回标准化的用户信息 return { uid = tostring(resp.id), username = resp.login, avatar = resp.avatar_url } end