Files
devstar-create-from-template/routers/web/auth/wechat_qr_auth.go

82 lines
2.8 KiB
Go
Raw Normal View History

2025-08-25 15:46:12 +08:00
package auth
import (
user_model "code.gitea.io/gitea/models/user"
wechat_model "code.gitea.io/gitea/models/wechat"
context "code.gitea.io/gitea/services/context"
wechat_service "code.gitea.io/gitea/services/wechat"
)
// WechatQrSignInSuccess 处理扫码登录用户Cookie保存等
//
// 由前端页面 window.location.href 跳转到 /user/login/wechat/success?ticket=${ticket}
func WechatQrSignInSuccess(ctx *context.Context) {
// 取出 微信公众号二维码 ticket
ticket := ctx.Base.Req.URL.Query().Get("ticket")
// 取出扫码用户状态
qrStatus, err := wechat_service.GetWechatQrStatusByTicket(ticket)
if err != nil {
// 重定向到主页,最终重定向到扫码登录页面
ctx.Redirect("/")
return
}
defer wechat_service.DeleteWechatQrByTicket(ticket)
// 检查用户扫码状态:已扫描、绑定,否则重定向到主页,最终重定向到扫码登录页面
if qrStatus == nil || !qrStatus.IsScanned || !qrStatus.IsBinded {
ctx.Redirect("/")
return
}
// 查询数据库扫码人信息
user, err := wechat_model.QueryUserByOpenid(ctx, qrStatus.OpenId)
// 登录成功,跳转目标页面
redirect := handleSignInFull(ctx, user, false, true)
if ctx.Written() {
return
}
ctx.Redirect(redirect)
return
}
// 检查是否携带了微信扫码注册账号信息,若携带了,同时绑定微信公众号 OpenID
// 若携带了微信公众号二维码ticket的后续步骤发生错误直接返回 ok = false 阻断注册过程
// 否则继续检查其他注册过程是否合规
// handleWechatRegistration 处理微信扫码注册逻辑
func handleWechatRegistration(ctx *context.Context, ticket string, u *user_model.User) bool {
// 根据微信二维码 Ticket 获取扫码信息,并删除相应缓存
qrStatus, err := wechat_service.GetWechatQrStatusByTicket(ticket)
if err != nil || qrStatus == nil {
ctx.Flash.Error("微信公众号扫码注册失败: 微信二维码无效,请使用密码登录")
ctx.Redirect("/user/login")
return false
}
// 检查二维码是否被扫描以及 OpenID 的有效性
if !qrStatus.IsScanned || len(qrStatus.OpenId) == 0 {
ctx.Flash.Error("微信公众号扫码注册失败: 微信二维码无效,请使用密码登录")
ctx.Redirect("/user/login")
return false
}
// 检查微信账号是否已绑定
if qrStatus.IsBinded {
ctx.Flash.Error("微信公众号扫码注册失败:该微信账号已绑定,请直接扫码登录")
ctx.Redirect("/")
return false
}
// 绑定微信公众号 OpenID 到 DevStar 用户
err = wechat_model.UpdateOrCreateWechatUser(ctx, u, qrStatus.OpenId)
if err != nil {
ctx.Flash.Error("绑定微信公众号失败,请使用密码登录: " + err.Error())
ctx.Redirect("/user/login")
return false
}
return true // 返回 true 表示注册流程继续
}