first-commit
This commit is contained in:
81
routers/web/auth/wechat_qr_auth.go
Normal file
81
routers/web/auth/wechat_qr_auth.go
Normal file
@@ -0,0 +1,81 @@
|
||||
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 表示注册流程继续
|
||||
}
|
Reference in New Issue
Block a user