- OAuth认证系统(Gitea + Lua扩展) - Git自动化操作(本地/SSH远程) - 实时进度WebSocket推送 - 现代化Tab界面UI - Cobra CLI命令行(init/version/serve) - 完整构建系统(Makefile + Taskfile) - UPX压缩支持(体积减少70%)
95 lines
2.5 KiB
Lua
95 lines
2.5 KiB
Lua
-- 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
|