我正在尝试将身份验证模型用于我的golang API,而我正在使用gin框架。我想使用curl发送身份验证令牌,然后验证它并在身份验证发生后执行所有crud操作。
我的代码是这样的:
func TokenAuthMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
token := c.Request.FormValue("token")
if token == "" {
respondWithError(401, "API token required", c)
return
}
if token != os.Getenv("API_TOKEN") {
respondWithError(401, "Invalid API token", c)
return
}
c.Next()
}
}
func respondWithError(code int, message string,c *gin.Context) {
resp := map[string]string{"error": message}
c.JSON(code, resp)
c.Abort()
}
主要功能:
func main() {
router := gin.Default()
router.Use(TokenAuthMiddleware())
router.Run(":8000")
}
如何使用curl传递身份验证令牌?
答案 0 :(得分:1)
c.Request.FormValue("token")
期望令牌通过application/x-www-form-urlencoded
POST请求发送。要使用cURL完成此操作,您可以执行以下操作:
$ curl -i --data "token=<token>" https://example.org/endpoint
此方法的缺点是,对于每个请求,您的POST
请求必须包含令牌值 - 但是如果您要使用GET
或DELETE
请求会怎样?
像@elithrar所说,发送带有Authorization
标头的身份验证令牌会更有意义。通过cURL在标头中发送身份验证令牌非常简单,请使用-H
标志,例如
$ curl -i POST -H "Authorization: Bearer <token>" --data "key1=value1&key2=value2" https://example.org
使用JWT正确签署身份验证令牌的方法。我建议使用dgrijalva/jwt-go
来使用JWT。
如果您只需要一个用户访问您的API,那么JWT并不是真正需要的。只需确保您的身份验证令牌是(伪)随机生成的,例如:使用openssl
库:
$ openssl rand -out $GOPATH/bin/token.key -base64 128