# JWT JWT中间件对Token进行认证,验证请求是否合法 ## 使用 编写业务逻辑: 暴露一个API,允许申请token, 假设用户名和密码是admin就是合法用户,为他生成一个token 代码中的secret为密钥,建议商用系统进行妥善的安全设计 ```go type HelloAuth struct { }

func (r *HelloAuth) Login(b *rf.Context) {

u := &User{} if err := b.ReadEntity(u); err != nil {

b.WriteError(http.StatusInternalServerError, err) return

} if u.Name == “admin” && u.Pwd == “admin” {

to, err := token.DefaultManager.Sign(map[string]interface{}{

“user”: u.Name, “pwd”: u.Pwd,

}, []byte(“my_secret”)) if err != nil {

b.WriteError(http.StatusInternalServerError, err)

} b.Write([]byte(to))

} else {

b.WriteError(http.StatusInternalServerError, errors.New(“wrong user or pwd”))

}

}

``` 定制token的认证逻辑,放开login api的访问 ```go

jwt.Use(&jwt.Auth{
MustAuth: func(req *http.Request) bool {
if strings.Contains(req.URL.Path, “/login”) {

return false

} return true

}, Realm: “test-realm”,

SecretFunc: func(claims interface{}, method token.SigningMethod) (interface{}, error) {

return []byte(“my_secret”), nil

},

})

```

更改配置文件, 将basicAuth handler添加到chain中,注意作为认证鉴权,一般说的都是服务端功能,所以要放到provider chain中 ```yaml servicecomb:

handler:
chain:
Provider:

default: jwt

```

验证与完整代码https://github.com/go-chassis/go-chassis/tree/master/examples/jwt