Как получить доступ к заявкам JWT из функций-обработчиков API в go-swagger? - PullRequest
0 голосов
/ 29 августа 2018

Я использую go-swagger с BearerAuth, используя токены JWT. Наряду с фактическим токеном я получаю заявки, в которые входят такие данные, как имя пользователя.

Как получить доступ к претензиям в функции api.ItemsCreateItemHandler ниже?

package restapi

func configureAPI(api *operations.MyAPI) http.Handler {
    api.BearerAuth = func(token string) (interface{}, error) {
        jwtToken := strings.Replace(token, "Bearer ", "", -1)
        // skipped token verification

        claims, _ := parsedToken.Claims.(jwt.MapClaims)
  }

  api.ItemsCreateItemHandler = items.CreateItemHandlerFunc(func(params items.CreateItemParams, principal interface{}) middleware.Responder {
    // FIXME: Here I need to be able to access JWT claims
    if err := createItem(params.Body, claims); err != nil {
            return nil // handle error
        }
        return items.NewCreateItemCreated()
    })
}

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

У меня есть класс, который хранит токен и содержит метод разбора:

import io.jsonwebtoken.*;

 @AllArgsConstructor
public class RawAccessJwtToken implements JwtToken {

    private String token;

    @Override
    public String getToken() {
        return token;
    }

    public Jws<Claims> parseClaims(String signingKey) {
        try {
            return Jwts.parser().setSigningKey(signingKey).parseClaimsJws(this.token);
        } catch (UnsupportedJwtException | MalformedJwtException | IllegalArgumentException e) {
            throw  new BadCredentialsException("Invalid JWT token: " + e);
        } catch (ExpiredJwtException expiredException){
            throw new JwtExpiredTokenException(this, "JWT Token expired", expiredException);
        }
    }
}

С помощью этого класса я могу извлечь свою роль пользователя:

 Jws<Claims> claimsJws = token.parseClaims(signingKey);

        List<String> scopes = claimsJws.getBody().get("scopes",
                 List.class);
0 голосов
/ 10 сентября 2018

JWT состоит из 3 частей, разделенных пунктуацией - сам токен закодирован в base64.

Например, вот токен от https://jwt.io/

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Вы хотите разделить и декодировать, вы после второй части, которая содержит полезную нагрузку, которая является просто JSON.

Так что в коде psuedo это будет выглядеть примерно так:

json = Base64Decode(split(".", yourData)[1])

Более конкретный пример вы увидите на https://jwt.io/

...