JWT¶
JWT中间件对Token进行认证,验证请求是否合法
使用¶
编写业务逻辑: 暴露一个API,允许申请token, 假设用户名和密码是admin就是合法用户,为他生成一个token 代码中的secret为密钥,建议商用系统进行妥善的安全设计
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的访问
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中
servicecomb:
handler:
chain:
Provider:
default: jwt
验证与完整代码https://github.com/go-chassis/go-chassis/tree/master/examples/jwt