|
|
|
|
@ -76,7 +76,7 @@ func authorizeThirdParty(x *vigo.X, req *AuthorizeRequest) (*AuthorizeResponse,
|
|
|
|
|
if req.BindMode {
|
|
|
|
|
userID := getCurrentUserID(x)
|
|
|
|
|
if userID == "" {
|
|
|
|
|
return nil, vigo.ErrNotAuthorized.WithString("login required for bind mode")
|
|
|
|
|
return nil, vigo.ErrUnauthorized.WithString("login required for bind mode")
|
|
|
|
|
}
|
|
|
|
|
stateData["user_id"] = userID
|
|
|
|
|
}
|
|
|
|
|
@ -125,17 +125,17 @@ type CallbackResponse struct {
|
|
|
|
|
// callbackThirdParty 处理第三方登录回调
|
|
|
|
|
func callbackThirdParty(x *vigo.X, req *CallbackRequest) (*CallbackResponse, error) {
|
|
|
|
|
if req.Error != "" {
|
|
|
|
|
return nil, vigo.ErrArgInvalid.WithString("oauth error: " + req.Error)
|
|
|
|
|
return nil, vigo.ErrInvalidArg.WithString("oauth error: " + req.Error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if req.Code == "" || req.State == "" {
|
|
|
|
|
return nil, vigo.ErrArgInvalid.WithString("missing code or state")
|
|
|
|
|
return nil, vigo.ErrInvalidArg.WithString("missing code or state")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 验证state
|
|
|
|
|
stateData, err := verifyState(req.State)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, vigo.ErrArgInvalid.WithString("invalid or expired state")
|
|
|
|
|
return nil, vigo.ErrInvalidArg.WithString("invalid or expired state")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
provider := stateData["provider"].(string)
|
|
|
|
|
@ -197,19 +197,19 @@ func bindThirdParty(x *vigo.X, req *BindRequest) (*AuthResponse, error) {
|
|
|
|
|
// 验证临时token
|
|
|
|
|
userInfo, err := verifyTempBindToken(req.TempToken)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, vigo.ErrArgInvalid.WithString("invalid or expired token")
|
|
|
|
|
return nil, vigo.ErrInvalidArg.WithString("invalid or expired token")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 查找用户
|
|
|
|
|
var user models.User
|
|
|
|
|
query := cfg.DB().Where("username = ? OR email = ? OR phone = ?", req.Username, req.Username, req.Username)
|
|
|
|
|
if err := query.First(&user).Error; err != nil {
|
|
|
|
|
return nil, vigo.ErrNotAuthorized.WithString("invalid credentials")
|
|
|
|
|
return nil, vigo.ErrUnauthorized.WithString("invalid credentials")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 验证密码
|
|
|
|
|
if !crypto.VerifyPassword(req.Password, user.Password) {
|
|
|
|
|
return nil, vigo.ErrNotAuthorized.WithString("invalid credentials")
|
|
|
|
|
return nil, vigo.ErrUnauthorized.WithString("invalid credentials")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 检查用户状态
|
|
|
|
|
@ -239,21 +239,21 @@ func bindWithRegister(x *vigo.X, req *BindWithRegisterRequest) (*AuthResponse, e
|
|
|
|
|
// 验证临时token
|
|
|
|
|
userInfo, err := verifyTempBindToken(req.TempToken)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, vigo.ErrArgInvalid.WithString("invalid or expired token")
|
|
|
|
|
return nil, vigo.ErrInvalidArg.WithString("invalid or expired token")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 检查用户名是否已存在
|
|
|
|
|
var count int64
|
|
|
|
|
cfg.DB().Model(&models.User{}).Where("username = ?", req.Username).Count(&count)
|
|
|
|
|
if count > 0 {
|
|
|
|
|
return nil, vigo.ErrArgInvalid.WithString("username already exists")
|
|
|
|
|
return nil, vigo.ErrInvalidArg.WithString("username already exists")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 检查邮箱是否已存在
|
|
|
|
|
if req.Email != "" {
|
|
|
|
|
cfg.DB().Model(&models.User{}).Where("email = ?", req.Email).Count(&count)
|
|
|
|
|
if count > 0 {
|
|
|
|
|
return nil, vigo.ErrArgInvalid.WithString("email already exists")
|
|
|
|
|
return nil, vigo.ErrInvalidArg.WithString("email already exists")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -311,7 +311,7 @@ type UnbindRequest struct {
|
|
|
|
|
func unbindThirdParty(x *vigo.X, req *UnbindRequest) error {
|
|
|
|
|
userID := getCurrentUserID(x)
|
|
|
|
|
if userID == "" {
|
|
|
|
|
return vigo.ErrNotAuthorized
|
|
|
|
|
return vigo.ErrUnauthorized
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 删除绑定关系
|
|
|
|
|
@ -335,7 +335,7 @@ type BindingInfo struct {
|
|
|
|
|
func listBindings(x *vigo.X) ([]BindingInfo, error) {
|
|
|
|
|
userID := getCurrentUserID(x)
|
|
|
|
|
if userID == "" {
|
|
|
|
|
return nil, vigo.ErrNotAuthorized
|
|
|
|
|
return nil, vigo.ErrUnauthorized
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var identities []models.Identity
|
|
|
|
|
@ -401,11 +401,11 @@ func buildAuthURL(provider, state string) (string, error) {
|
|
|
|
|
case "wechat":
|
|
|
|
|
pc = cfg.Config.Providers.WeChat
|
|
|
|
|
default:
|
|
|
|
|
return "", vigo.ErrArgInvalid.WithString("unsupported provider: " + provider)
|
|
|
|
|
return "", vigo.ErrInvalidArg.WithString("unsupported provider: " + provider)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if !pc.Enabled {
|
|
|
|
|
return "", vigo.ErrArgInvalid.WithString("provider not enabled: " + provider)
|
|
|
|
|
return "", vigo.ErrInvalidArg.WithString("provider not enabled: " + provider)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
params := url.Values{}
|
|
|
|
|
|