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