首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从go-swagger中的API处理函数访问JWT声明?

如何从go-swagger中的API处理函数访问JWT声明?
EN

Stack Overflow用户
提问于 2018-08-30 03:42:05
回答 3查看 657关注 0票数 7

我将go-swagger与使用JWT令牌的BearerAuth一起使用。除了实际的令牌之外,我还收到了包含用户名等数据的声明。

如何在下面的api.ItemsCreateItemHandler函数中访问报销申请?

代码语言:javascript
复制
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()
    })
}
EN

回答 3

Stack Overflow用户

发布于 2021-01-09 00:53:26

首先,您的BearerAuth实现将返回安全主体(在本例中可以是您的声明),该值随后将在principal参数中传递给您的处理程序。

因此,实现这一点的方法是:

代码语言:javascript
复制
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{}

票数 1
EN

Stack Overflow用户

发布于 2018-09-10 17:17:32

一个JWT由3个部分组成,用标点符号分割--令牌本身是base64编码的。

例如,这里有一个来自https://jwt.io/的令牌

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

你会想要拆分和解码,你需要的是第二部分,它包含了纯JSON的有效负载。

所以在psuedo代码中,它看起来像这样;

代码语言:javascript
复制
json = Base64Decode(split(".", yourData)[1])

您将在https://jwt.io/上看到更具体的示例

票数 -1
EN

Stack Overflow用户

发布于 2018-09-10 22:16:46

我有一个存储令牌并包含解析方法的类:

代码语言:javascript
复制
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);
        }
    }
}

有了这个类,我可以提取我的用户角色:

代码语言:javascript
复制
 Jws<Claims> claimsJws = token.parseClaims(signingKey);

        List<String> scopes = claimsJws.getBody().get("scopes",
                 List.class);
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52085009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档