2

我正在使用goa制作一个 Web 服务器(无法为其创建堆栈溢出标签,没有足够的声誉)。

我找不到在控制器方法中获取用户上下文的方法。我使用基本身份验证支持的 JWT 身份验证。我有一个通过 JWT 中间件保护的 JWT 安全操作,它检查密码等。

我想要的是从 JWT 令牌获取用户名到安全方法。有什么办法吗?

goa 设计文件片段:

var JWT = JWTSecurity("jwt", func() {
    Header("Authorization")
    Scope("api:access", "API access") // Define "api:access" scope
})

Security(JWT, func() {
    // Use JWT to auth requests to this endpoint
    Scope("api:access") // Enforce presence of "api" scope in JWT claims.
})

Action("secure", func() {
    Description("This action is secured with the jwt scheme")
    Routing(GET("/jwt"))
    Response(OK)
})

这个DSL生成到这个方法中:

func (c *JWTSessionsController) Secure(ctx *app.SecureJWTContext) error {
    return ctx.OK(&app.Success{false})
}

生成的操作是安全的并且运行良好(已安装中间件并且所有验证通过)。但我想在操作中获取用户名。有可能吗?

我想以这种方式得到它:

ctx.User.Username

现在我将不得不解析 jwt 两次。:(

我做了一个解析 base64 令牌声明的助手。

4

1 回答 1

1

jwt包公开了一个ContextJWT函数,该函数从请求上下文中提取 JWT 令牌内容。这使得检索存储在令牌中的声明成为可能:

token := jwt.ContextJWT(ctx)
claims := token.Claims.(jwtgo.MapClaims)
subject := claims["sub"] // "sub" claim contains security principal
// ... use subject to authenticate

jwtgodgrijalva/jwt-go 包在哪里。

于 2016-10-15T16:41:10.507 回答