// 获取微信认证页面的 url // 需要提供 redirect_uri func AuthURLHandler(ctx *gin.Context) { // MustAuthHandler(ctx) queryValues := ctx.Request.URL.Query() redirectURI := queryValues.Get("redirect_uri") if redirectURI == "" { ctx.JSON(200, errors.ErrBadRequest) return } if !strings.HasPrefix(redirectURI, "https:") && !strings.HasPrefix(redirectURI, "http:") { redirectURI = config.ConfigData.WebServer.BaseURL + redirectURI } tk := ctx.MustGet("sso_token").(*token.Token) ss := ctx.MustGet("sso_session").(*session.Session) ss.OAuth2State = string(random.NewRandomEx()) if err := session.Set(tk.SessionId, ss); err != nil { glog.Errorln(err) ctx.JSON(200, errors.ErrInternalServerError) return } authURL := oauth2.AuthCodeURL(config.ConfigData.Weixin.MP.AppId, redirectURI, "snsapi_userinfo", ss.OAuth2State, nil) resp := struct { *errors.Error URL string `json:"url"` }{ Error: errors.ErrOK, URL: authURL, } ctx.JSON(200, &resp) return }
// 获取请求用户授权的参数(appid, state, scope) func AuthParaHandler(ctx *gin.Context) { // MustAuthHandler(ctx) tk := ctx.MustGet("sso_token").(*token.Token) ss := ctx.MustGet("sso_session").(*session.Session) ss.OAuth2State = string(random.NewRandomEx()) if err := session.Set(tk.SessionId, ss); err != nil { glog.Errorln(err) ctx.JSON(200, errors.ErrInternalServerError) return } resp := struct { *errors.Error AppId string `json:"appid"` State string `json:"state"` Scope string `json:"scope"` }{ Error: errors.ErrOK, AppId: config.ConfigData.Weixin.Open.App.AppId, State: ss.OAuth2State, Scope: "snsapi_userinfo", } ctx.JSON(200, &resp) return }
func setPassword(userId int64, password, salt []byte) (err error) { stmt, err := db.GetStmt("update user set password=?, password_tag=?, salt=? where id=? and verified=1") if err != nil { return } _, err = stmt.Exec(password, random.NewRandomEx(), salt, userId) return }
// 通过 邮箱 注册一个账户. // 如果 nickname 为空, 则默认为 email // 验证码注册时, password, salt 可以为 nil // 如果 timestamp == 0 则默认使用当前时间 func AddByEmail(email, nickname string, password, salt []byte, timestamp int64) (userId int64, err error) { userId, err = userid.GetId() if err != nil { return } if nickname == "" { nickname = email } if password == nil { password = emptyByteSlice } if salt == nil { salt = emptyByteSlice } if timestamp == 0 { timestamp = time.Now().Unix() } para := struct { UserId int64 `sqlx:"user_id"` BindType BindType `sqlx:"bind_type"` Email string `sqlx:"email"` Nickname string `sqlx:"nickname"` Password []byte `sqlx:"password"` PasswordTag []byte `sqlx:"password_tag"` Salt []byte `sqlx:"salt"` CreateTime int64 `sqlx:"create_time"` }{ UserId: userId, BindType: BindTypeEmail, Email: email, Nickname: nickname, Password: password, PasswordTag: random.NewRandomEx(), Salt: salt, CreateTime: timestamp, } tx, err := db.GetDB().Beginx() if err != nil { return } // user_email 表增加一个 item stmt1, err := tx.Prepare("insert into user_email(user_id, email, verified) values(?, ?, 0)") if err != nil { tx.Rollback() return } if _, err = stmt1.Exec(para.UserId, para.Email); err != nil { tx.Rollback() return } // user 表增加一个 item stmt2, err := tx.PrepareNamed("insert into user(id, nickname, bind_types, password, password_tag, salt, create_time, verified) values(:user_id, :nickname, :bind_type, :password, :password_tag, :salt, :create_time, 0)") if err != nil { tx.Rollback() return } if _, err = stmt2.Exec(para); err != nil { tx.Rollback() return } err = tx.Commit() return }
func NewTokenId() string { return string(random.NewRandomEx()) }
// 通过 微信 注册一个账户. // 如果 nickname 为空, 则默认为 openid // 如果 timestamp == 0 则默认使用当前时间 func AddByWechat(openid, nickname string, timestamp int64) (userId int64, err error) { userId, err = userid.GetId() if err != nil { return } if nickname == "" { nickname = openid } if timestamp == 0 { timestamp = time.Now().Unix() } para := struct { UserId int64 `sqlx:"user_id"` BindType BindType `sqlx:"bind_type"` OpenId string `sqlx:"openid"` Nickname string `sqlx:"nickname"` Password []byte `sqlx:"password"` PasswordTag []byte `sqlx:"password_tag"` Salt []byte `sqlx:"salt"` CreateTime int64 `sqlx:"create_time"` }{ UserId: userId, BindType: BindTypeWechat, OpenId: openid, Nickname: nickname, Password: emptyByteSlice, PasswordTag: random.NewRandomEx(), Salt: emptyByteSlice, CreateTime: timestamp, } tx, err := db.GetDB().Beginx() if err != nil { return } // user_wechat 表增加一个 item stmt1, err := tx.Prepare("insert into user_wechat(user_id, openid, verified) values(?, ?, 0)") if err != nil { tx.Rollback() return } if _, err = stmt1.Exec(para.UserId, para.OpenId); err != nil { tx.Rollback() return } // user 表增加一个 item stmt2, err := tx.PrepareNamed("insert into user(id, nickname, bind_types, password, password_tag, salt, create_time, verified) values(:user_id, :nickname, :bind_type, :password, :password_tag, :salt, :create_time, 0)") if err != nil { tx.Rollback() return } if _, err = stmt2.Exec(para); err != nil { tx.Rollback() return } err = tx.Commit() return }