果阿中的用户感知操作

User aware action in goa

我正在用 goa 制作网络服务器(无法为其创建堆栈溢出标记,信誉不足)。

我找不到在控制器方法中获取用户上下文的方法。 我使用基本身份验证支持的 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 令牌声明的助手。

从请求上下文中提取 JWT 令牌内容的 jwt package exposes a ContextJWT 函数。这使得检索存储在令牌中的声明成为可能:

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

其中 jwtgo 是 dgrijalva/jwt-go 包。