@ -57,7 +57,7 @@ func listProviders(x *vigo.X) ([]ProviderInfo, error) {
type AuthorizeRequest struct {
type AuthorizeRequest struct {
Provider string ` json:"provider" src:"query" desc:"提供商: google/github/wechat" `
Provider string ` json:"provider" src:"query" desc:"提供商: google/github/wechat" `
Redirect string ` json:"redirect" src:"query" desc:"登录成功后重定向地址" `
Redirect string ` json:"redirect" src:"query" desc:"登录成功后重定向地址" `
BindMode bool ` json:"bind_mode" src:"query" desc:"是否为绑定模式" `
BindMode * bool ` json:"bind_mode" src:"query" desc:"是否为绑定模式" `
}
}
// AuthorizeResponse 授权响应
// AuthorizeResponse 授权响应
@ -82,7 +82,7 @@ func authorizeThirdParty(x *vigo.X, req *AuthorizeRequest) (*AuthorizeResponse,
}
}
// 如果是绑定模式,需要当前用户登录
// 如果是绑定模式,需要当前用户登录
if req . BindMode {
if req . BindMode != nil && * req . BindMode {
userID := baseauth . VBaseAuth . UserID ( x )
userID := baseauth . VBaseAuth . UserID ( x )
if userID == "" {
if userID == "" {
return nil , vigo . ErrUnauthorized . WithString ( "login required for bind mode" )
return nil , vigo . ErrUnauthorized . WithString ( "login required for bind mode" )
@ -109,10 +109,10 @@ func authorizeThirdParty(x *vigo.X, req *AuthorizeRequest) (*AuthorizeResponse,
// CallbackRequest 第三方登录回调请求
// CallbackRequest 第三方登录回调请求
type CallbackRequest struct {
type CallbackRequest struct {
Provider string ` json:"provider" src:"path" desc:"提供商" `
Provider string ` json:"provider" src:"path" desc:"提供商" `
Code string ` json:"code" src:"query" desc:"授权码" `
Code string ` json:"code" src:"query" desc:"授权码" `
State string ` json:"state" src:"query" desc:"状态值" `
State string ` json:"state" src:"query" desc:"状态值" `
Error string ` json:"error" src:"query" desc:"错误信息" `
Error * string ` json:"error" src:"query" desc:"错误信息" `
}
}
// CallbackResponse 回调响应
// CallbackResponse 回调响应
@ -133,8 +133,8 @@ type CallbackResponse struct {
// callbackThirdParty 处理第三方登录回调
// callbackThirdParty 处理第三方登录回调
func callbackThirdParty ( x * vigo . X , req * CallbackRequest ) ( * CallbackResponse , error ) {
func callbackThirdParty ( x * vigo . X , req * CallbackRequest ) ( * CallbackResponse , error ) {
if req . Error != "" {
if req . Error != nil && * req . Error != "" {
return nil , vigo . ErrInvalidArg . WithString ( "oauth error: " + req . Error )
return nil , vigo . ErrInvalidArg . WithString ( "oauth error: " + * req . Error )
}
}
if req . Code == "" || req . State == "" {
if req . Code == "" || req . State == "" {
@ -237,10 +237,10 @@ func bindThirdParty(x *vigo.X, req *BindRequest) (*AuthResponse, error) {
// BindWithRegisterRequest 绑定并注册新账号(可选功能)
// BindWithRegisterRequest 绑定并注册新账号(可选功能)
type BindWithRegisterRequest struct {
type BindWithRegisterRequest struct {
TempToken string ` json:"temp_token" src:"json" desc:"临时绑定令牌" `
TempToken string ` json:"temp_token" src:"json" desc:"临时绑定令牌" `
Username string ` json:"username" src:"json" desc:"用户名" `
Username string ` json:"username" src:"json" desc:"用户名" `
Email string ` json:"email" src:"json" desc:"邮箱" `
Email * string ` json:"email" src:"json" desc:"邮箱" `
Phone string ` json:"phone" src:"json" desc:"手机号" `
Phone * string ` json:"phone" src:"json" desc:"手机号" `
}
}
// bindWithRegister 绑定并创建新账号
// bindWithRegister 绑定并创建新账号
@ -259,8 +259,8 @@ func bindWithRegister(x *vigo.X, req *BindWithRegisterRequest) (*AuthResponse, e
}
}
// 检查邮箱是否已存在
// 检查邮箱是否已存在
if req . Email != "" {
if req . Email != nil && * req . Email != "" {
cfg . DB ( ) . Model ( & models . User { } ) . Where ( "email = ?" , req . Email ) . Count ( & count )
cfg . DB ( ) . Model ( & models . User { } ) . Where ( "email = ?" , * req . Email ) . Count ( & count )
if count > 0 {
if count > 0 {
return nil , vigo . ErrInvalidArg . WithString ( "email already exists" )
return nil , vigo . ErrInvalidArg . WithString ( "email already exists" )
}
}
@ -270,20 +270,11 @@ func bindWithRegister(x *vigo.X, req *BindWithRegisterRequest) (*AuthResponse, e
randomPassword := generateRandomPassword ( 16 )
randomPassword := generateRandomPassword ( 16 )
hashedPassword , _ := crypto . HashPassword ( randomPassword , 12 )
hashedPassword , _ := crypto . HashPassword ( randomPassword , 12 )
var email * string
if req . Email != "" {
email = & req . Email
}
var phone * string
if req . Phone != "" {
phone = & req . Phone
}
user := & models . User {
user := & models . User {
Username : req . Username ,
Username : req . Username ,
Password : hashedPassword ,
Password : hashedPassword ,
Email : email,
Email : req . Email ,
Phone : p hone,
Phone : req . Phone ,
Nickname : userInfo . Name ,
Nickname : userInfo . Name ,
Avatar : userInfo . Avatar ,
Avatar : userInfo . Avatar ,
Status : models . UserStatusActive ,
Status : models . UserStatusActive ,