feat: 初始提交 - Code Server Bridge完整实现
- OAuth认证系统(Gitea + Lua扩展) - Git自动化操作(本地/SSH远程) - 实时进度WebSocket推送 - 现代化Tab界面UI - Cobra CLI命令行(init/version/serve) - 完整构建系统(Makefile + Taskfile) - UPX压缩支持(体积减少70%)
This commit is contained in:
94
scripts/oauth/gitea.lua
Normal file
94
scripts/oauth/gitea.lua
Normal file
@@ -0,0 +1,94 @@
|
||||
-- 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
|
||||
Reference in New Issue
Block a user