Действия пользователя в Гоа

Я создаю веб-сервер с goa (не могу создать для него тег переполнения стека, недостаточно репутации).

Я не могу найти способ получить пользовательский контекст внутри метода контроллера. Я использую аутентификацию JWT, которая поддерживается базовой аутентификацией. У меня есть безопасное действие JWT, защищенное с помощью промежуточного программного обеспечения JWT, которое проверяет пароли и т. д.

Я хочу получить имя пользователя из токена JWT в безопасный метод. Там в любом случае?

Фрагмент файла дизайна Гоа:

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.


person vvwccgz4lh    schedule 15.10.2016    source источник


Ответы (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

Где jwtgo — это пакет dgrijalva/jwt-go.

person raphael    schedule 15.10.2016
comment
Это неплохо, но все еще нуждается в некоторой обертке, чтобы изолировать инфраструктуру jwt-go от сгенерированного контроллера. Вроде должно работать - person vvwccgz4lh; 16.10.2016