上一篇介绍了如何撰写及使用middleware,而iris也有许多好用的middleware,所以本篇就来介绍一个好用的middleware jwt。
本文同步放置於此
介绍jwt这个middleware之前还是需要跟大家说明什麽是jwt,接下来再跟大家说明如何使用jwt这个middleware,所以接下来就是跟着这节奏先跟大家介绍什麽是jwt。
在介绍iris怎麽处理jwt之前先说明一下jwt是什麽,jwt就是JSON Web Token的缩写,详细内容可以看一下jwt wiki的说明,简单来说就是一种验证使用者的协定,这协定可以将使用者的资料加密存放在token之中,因此可以透过这token来取得使用者资料而不需要再与资料库沟通,所以可以再登入最後将些非敏感的使用者资料存放在token之中,所以接下来再跟大家分享一下如何在iris使用jwt。
因为iris有内建一个middleware来处理jwt,所以我们藉由iris jwt example这个范例来说明一下在iris如何使用jwt这个middleware来处理JSON Web Token,首先先看一下下列例子
package main
import (
"github.com/kataras/iris/v12"
"github.com/iris-contrib/middleware/jwt"
)
var mySecret = []byte("My Secret")
// generate token to use.
func getTokenHandler(ctx iris.Context) {
token := jwt.NewTokenWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"foo": "bar",
})
// Sign and get the complete encoded token as a string using the secret
tokenString, _ := token.SignedString(mySecret)
ctx.HTML(`Token: ` + tokenString + `<br/><br/>
<a href="/secured?token=` + tokenString + `">/secured?token=` + tokenString + `</a>`)
}
func myAuthenticatedHandler(ctx iris.Context) {
user := ctx.Values().Get("jwt").(*jwt.Token)
ctx.Writef("This is an authenticated request\n")
ctx.Writef("Claim content:\n")
foobar := user.Claims.(jwt.MapClaims)
for key, value := range foobar {
ctx.Writef("%s = %s", key, value)
}
}
func main() {
app := iris.New()
j := jwt.New(jwt.Config{
ValidationKeyGetter: func(token *jwt.Token) (interface{}, error) {
return mySecret, nil
},
// Extract by the "token" url.
// There are plenty of options.
// The default jwt's behavior to extract a token value is by
// the `Authorization: Bearer $TOKEN` header.
Extractor: jwt.FromParameter("token"),
// When set, the middleware verifies that tokens are
// signed with the specific signing algorithm
// If the signing method is not constant the `jwt.Config.ValidationKeyGetter` callback
// can be used to implement additional checks
// Important to avoid security issues described here:
// https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/
SigningMethod: jwt.SigningMethodHS256,
})
app.Get("/", getTokenHandler)
app.Get("/secured", j.Serve, myAuthenticatedHandler)
// j.CheckJWT(Context) error can be also used inside handlers.
app.Listen(":8080")
}
这里要关注的是getTokenHandler与myAuthenticatedHandler这两个handler
,接下来我们分段说明jwt的用法。
生成jwt的方法在getTokenHandler可以看到,在这个步骤我们多放一个map到token待之後的范例会介绍如何取出来,最後为了安全措施我们又针对token再加密一次,利用我们的mySecret属性,完整的语法是tokenString, _ := token.SignedString(mySecret)
读者们应该有注意到在绑定myAuthenticatedHandler这handler
前有加了另外一个j.Serve
如此可以再执行处理请求前先验证jwt是否合法,所以只要把要加入验证的handler
多加一个j.Serve
的前置处理即可。
前面有提到可以把使用者资讯存在token中,那要如何取出来呢,这个解答在myAuthenticatedHandler中就可以看得到,简单讲就是透过user := ctx.Values().Get("jwt").(*jwt.Token)
就可以取得我们放到token的资讯。
最後可以透过foobar := user.Claims.(jwt.MapClaims)
可以取得我们生成token时放进去的资料。
在本例子中是将token放在query string里面,但是常用的方法是jwt放在header
内,如此可以减少被篡改的机会,那样要如何实作呢,简单的讲就是将Extractor
的值改成jwt.FromAuthHeader
即可,不过要注意放在header
时要记得在token前加上bearer以及一个空格,不然会验证失败喔。
上面的例子产生的例子是永久生效的,不过我们可以使用jwt产生使用期限,请大家看一下下面的例子
token := jwt.NewTokenWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"foo": "bar",
"exp": time.Now().Add(time.Hour * time.Duration(12)).Unix() // 合法的时间戳
"iat": time.Now().Unix() // 签发token的时间戳
})
上面的例子将token加上签发时间戳以及合法的时间戳,最後在生成middleware的config加上以下参数即可
j := jwt.New(jwt.Config{
ValidationKeyGetter: func(token *jwt.Token) (interface{}, error) {
return mySecret, nil
},
Extractor: jwt.FromParameter("token"),
SigningMethod: jwt.SigningMethodHS256,
Expiration:true,
})
本篇跟大家介绍一个验证的利器jwt,并且介绍如何在iris使用jwt这个middleware,希望能够帮助大家了解关於iris上的使用者验证的方法。
昨天介绍完了储存各种档案可以使用的 Cloud Storage,今天要来介绍另外一个很常见的储存服务...
一样先确认使用者在文件库有哪些文件 确认传送来的文件doc_id是属於使用者 确认文件存在後回传Ht...
Abstract 大家每天都是新的开始,都有24H小时给你规划,系统跟人类一样都是有自己的周期性计画...
接下来资料库的部份会用到laravel schema,因为个人觉得比较好看.... 理解上应该不会差...
接续昨天 response headers 的部分 一样是看 Julia Evans 大大的可爱的图...