這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
這裡採用的是在header裡設定token進行鑒權,cookie也類似:
基本思路為前端在header裡設定token,後端採用redis等進行儲存,使用中介軟體進行鑒權,登入時設定token。
以下是登入產生token:
設定
if err:=tools.NewAccountSsdbCache(info.Id,token);err!=nil { c.JSON(403,gin.H{"status":403,"msg":to.String(err), })return}
方法
func NewAccountSsdbCache(userid int64,val string)(err error){ssdb,err:=common.NewSsdbClient()if err!=nil {return err}defer ssdb.Close()if err:=ssdb.Set(MakeSSdbCacheKey(userid),val,60);err!=nil{return err}return nil}
中介軟體鑒權
api:=rounter.Group("/api")api.Use(middleware.AccessTokenMiddleware())
方法
func AccessTokenMiddleware() gin.HandlerFunc {return func(c *gin.Context) {authtoken:=c.Request.Header.Get("AuthToken")if authtoken==""{// 沒有提供許可權tokenc.JSON(401, gin.H{"status": 401,"msg": "header缺少authtoken!",})c.Abort()return}else {auth, err := DecodeAuthV1(authtoken)if err != nil {// 許可權資訊不完整c.JSON(401,gin.H{"status":401,"msg":"許可權資訊不完整!",})c.Abort()return}account := &model.Account{}o := common.NewOrm()o.QueryTable("account").Filter("id", auth["id"]).One(account, "id", "account_token", "auth_token")if account.Id == 0 || account.AccountToken != auth["token"] || account.AuthToken != authtoken {// 許可權資訊偽造或者已經失效c.JSON(401, gin.H{"status": 401,"msg": "許可權資訊已經失效,請重新登入",})c.Abort()return}ssdb,err:=common.NewSsdbClient()if err != nil {c.JSON(401, gin.H{"status": 401,"msg": "許可權擷取失敗,嘗試重新操作",})c.Abort()return}defer ssdb.Close()val,err:=ssdb.Get("OG"+to.String(account.Id))if err!=nil{c.JSON(401, gin.H{"status": 401,"msg": "許可權資訊擷取失敗,請重試!",})c.Abort()return}if authtoken!=to.String(val) {c.JSON(401, gin.H{"status": 401,"msg": "許可權資訊不一致!",})c.Abort()return}}c.Next()}}
以上就完成了簡單的登入產生token和鑒權的過程!覺得有用點個推薦吧!⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄
1212 次點擊 ∙ 2 贊