iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 9
0

Middleware (中間層)

什麼是Middleware呢?
最簡單來說就是一個機制來過濾請求,例如某一支API要登入才能打,那在進入主邏輯之前會先驗證,這個驗證的行為就可以放在中間層做。

來開始吧

middleware/auth.go

// Auth Auth
func Auth() gin.HandlerFunc {
	return func(c *gin.Context) {
        // 取得token
		token, err := c.Cookie(jwt.Key)
		if err != nil {
			c.JSON(http.StatusUnauthorized, gin.H{
				"result":     false,
				"error_code": res.ErrUnauthorizedCode,
			})
            c.Abort()
			return
		}
        // 解析token 取得會員的資料
		userID, userName, err := jwt.ParseToken(token)
		if err != nil || userID == "" || userName == "" {
			c.JSON(http.StatusUnauthorized, gin.H{
				"result":     false,
				"error_code": res.ErrUnauthorizedCode,
			})
            c.Abort()
			return
		}

        // 把值傳到下一層
		c.Set("user_id", userID)
		c.Set("user_name", userName)

		c.Next()
	}
}

在router加上這個中間層,就可以擋掉一些沒token的請求哦
EX.

api.GET("delete", middleware.Auth(), deleteFunc)

會員資訊API

現在可以登入了,那要提供一支API給前端查會員的資料

API: /api/user/info
回傳值:

key type
is_login bool
user_name string
user_id string

handler/user.go


// GetUserInfo GetUserInfo
func GetUserInfo(c *gin.Context) {
	token, err := c.Cookie(jwt.Key)
	if err != nil {
		res.Success(c, gin.H{
			"is_login":  false,
			"user_name": "",
			"user_id":   "",
		})
		return
	}

	id, name, err := jwt.ParseToken(token)
	if err != nil {
		res.Success(c, gin.H{
			"is_login":  false,
			"user_name": "",
			"user_id":   "",
		})
		return
	}

	res.Success(c, gin.H{
		"is_login":  true,
		"user_name": name,
		"user_id":   id,
	})
}

試打一下
https://ithelp.ithome.com.tw/upload/images/20200916/20129767uII7kabytK.png

謝謝大家~


上一篇
Day 8 來做Google登入吧 - 2
下一篇
Day 10 DB schema
系列文
Golang & Vue.js 30天從0打造服務30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言