我将go-swagger与使用JWT令牌的BearerAuth一起使用。除了实际的令牌之外,我还收到了包含用户名等数据的声明。
如何在下面的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()
})
}发布于 2021-01-09 00:53:26
首先,您的BearerAuth实现将返回安全主体(在本例中可以是您的声明),该值随后将在principal参数中传递给您的处理程序。
因此,实现这一点的方法是:
package restapi
import (
jwt "github.com/dgrijalva/jwt-go"
// ...
)
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)
return claims, nil
}
api.ItemsCreateItemHandler = items.CreateItemHandlerFunc(func(params items.CreateItemParams, principal interface{}) middleware.Responder {
claims, ok := principal.(jwt.MapClaims)
if !ok {
// handle error
}
if err := createItem(params.Body, claims); err != nil {
return nil // handle error
}
return items.NewCreateItemCreated()
})
}您可以通过对swagger generate使用--principal jwt.MapClaims选项来简化这一过程,以便它对声明使用此类型,而不是interface{}。
发布于 2018-09-10 17:17:32
一个JWT由3个部分组成,用标点符号分割--令牌本身是base64编码的。
例如,这里有一个来自https://jwt.io/的令牌
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
你会想要拆分和解码,你需要的是第二部分,它包含了纯JSON的有效负载。
所以在psuedo代码中,它看起来像这样;
json = Base64Decode(split(".", yourData)[1])您将在https://jwt.io/上看到更具体的示例
发布于 2018-09-10 22:16:46
我有一个存储令牌并包含解析方法的类:
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);https://stackoverflow.com/questions/52085009
复制相似问题