91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在go-zero中使用jwt-token鑒權實踐

發布時間:2021-12-23 18:39:14 來源:億速云 閱讀:529 作者:柒染 欄目:云計算

本篇文章給大家分享的是有關如何在go-zero中使用jwt-token鑒權實踐,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

創建項目

生成go.mod文件

以如下指令創建項目

mkdir jwttoken
cd jwttoken
go mod init  jwttoken

定義user.api

本文設計API如下 |描述|格式|方法|參數|返回|是否需要鑒權| |----|----|----|----|----|----| |用戶登錄|/open/authorization|post|mobile:手機號,passwd:密碼,code:圖片驗證碼|id:用戶ID,token:用戶token|否| |更新用戶信息|/user/update|post|mobile:用戶手機號|token:用戶新的token|是|

根據以上描述,書寫api的模板文件如下

type (
	UserOptReq struct {
		mobile string `form:"mobile"`
		passwd string `form:"passwd"`
		code   string `form:"code,optional"`
	}

	UserOptResp struct {
		id    uint   `json:"id"`
		token string `json:"token"`
	}
	//修改
	UserUpdateReq struct {
		id     uint   `form:"id"`
		mobile string `form:"mobile,optional"`
	}
)

service user-api {
	@server(
		handler: authorizationHandler
		folder: open
	)
	post /open/authorization(UserOptReq) returns(UserOptResp)

	@server(
		handler: edituserHandler
		folder: user
	)
	post /user/update(UserUpdateReq) returns(UserOptResp)
	
}

注意

  • 一個文件里面只能有一個service

  • 工具最后會以type里面模型為樣板生成各種結構體,所以參數和結構體保持一致即可

  • 如果我們需要分文件夾管理業務, 可以用folder屬性來定義

生成代碼

采用如下指令生成代碼

goctl api  go   -api   user.api   -dir  .

運行一下

go run open.go

測試一下

curl http://127.0.0.1:8888/open/authorization -X POST -d "mobile=15367151352&passwd=123rte&code=asasa"\"passwd\":\"testpwd\",\"code\":\"asdf\"}
{"id":0,"token":""}

中間件實現鑒權

handler下新建auth.go文件,關鍵代碼如下

//鑒權白名單,在這里面的是不需要鑒權的
var whiteList []string = []string{
	"/open/",
}

//鑒權中間件
func Auth(next http.HandlerFunc) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		w.Header().Add("X-Middleware", "auth")
		uri := r.RequestURI
		//默認不在
		isInWhiteList := false
		//判斷請求是否包含白名單中的元素
		for _, v := range whiteList {
			if strings.Contains(uri, v) {
				isInWhiteList = true
			}
		}
		//如果愛白名單里面直接通過
		if isInWhiteList {
			next(w, r)
			return
		}
		//否則獲取前端header 里面的X-Token字段,這個就是token	
		token := r.Header.Get("X-Token")
		//工具類見util\jwttoken.go
		_, err := utils.DecodeJwtToken(token)
		//如果有錯直接返回error
		if err != nil {
			httpx.Error(w, err)
			return
		}
		//沒報錯就繼續
		next(w, r)
	}
}

routers.go中添加一行代碼

func RegisterHandlers(engine *rest.Server, serverCtx *svc.ServiceContext) {
	//添加這行代碼
	engine.Use(Auth)
	///。。
}	

生成jwttoken

logic\open\authorizationlogic.go中實現jwttoken的獲取

func (l *AuthorizationLogic) Authorization(req types.UserOptReq) (*types.UserOptResp, error) {
	//這個是生成jwttoken的工具類
	token, err := utils.EncodeJwtToken(map[string]interface{}{
		"role": "kefu",
		"id":   "10086",
	})
	return &types.UserOptResp{
		Token: token,
	}, err
}

測試

不攜帶token時訪問

>curl http://127.0.0.1:8888/user/update -X POST -d "mobile=15367151352&id=123"
鑒權失敗,缺少鑒權參數

獲取token

>curl http://127.0.0.1:8081/open/authorization -X POST -d "mobile=15367151352&passwd=123rte&code=asasa"
{"id":1599063149,"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTkzMjIzNDksImlkIjoiMTUzNjcxNTEzNTIifQ.jcdg3c2rdigPO5ZTxcDilVGERAuMIdY9BUmMNX3ZA9c"}

攜帶token時訪問

>curl http://127.0.0.1:8888/user/update -X POST -H "X-Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTkzMjIzNDksImlkIjoiMTUzNjcxNTEzNTIifQ.jcdg3c2rdigPO5ZTxcDilVGERAuMIdY9BUmMNX3ZA9c" -d "mobile=15367151352&id=123"
# 請求成功
{"id":123,"token":""}

攜帶錯誤的token時訪問

>curl http://127.0.0.1:8888/user/update -X POST -H "X-Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTkzMjIzNDksImlkIjoiMTUzNjcxNTEzNTIifQ.jcdg3c2rdigPO5ZTxcDilVGERAuMIdY9BUmMNX3ZA9c0000" -d "mobile=15367151352&id=123"
# 返回簽名無效
signature is invalid

以上就是如何在go-zero中使用jwt-token鑒權實踐,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宽城| 夏邑县| 东莞市| 友谊县| 郴州市| 毕节市| 通辽市| 南通市| 周宁县| 闻喜县| 灵台县| 吉木萨尔县| 毕节市| 景宁| 文登市| 务川| 洛阳市| 桑日县| 太原市| 康定县| 当涂县| 正安县| 体育| 望江县| 沂水县| 天柱县| 当雄县| 五家渠市| 青川县| 蒲江县| 黄龙县| 华坪县| 贵德县| 大英县| 肇州县| 苏州市| 静宁县| 喜德县| 济南市| 怀来县| 凯里市|