Files
devstar-create-from-template/routers/web/auth/wechat_qr_auth.go
2025-08-25 15:46:12 +08:00

82 lines
2.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 表示注册流程继续
}