82 lines
2.8 KiB
Go
82 lines
2.8 KiB
Go
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 表示注册流程继续
|
||
}
|