2
votes

comment obtenir la valeur des revendications à partir de l'authentification par jeton JWT

J'ai défini des revendications dans le jeton JWT dans le fournisseur de jetons. maintenant, je souhaite obtenir la valeur de la revendication via l'authentification lorsque l'API est touchée.

J'ai vérifié le principal, les détails, les informations d'identification, les autorités, mais je ne reçois de revendications dans aucun d'entre eux.

Claims claims = Jwts.claims().setSubject(authentication.getName());
    claims.put(AUTHORITIES_KEY, authorities);
    claims.put("userId", userRepo.findUserIdByUsername(authentication.getName()));

   return Jwts.builder()
            .setSubject(authentication.getName())
            .setClaims(claims)
            //.claim(AUTHORITIES_KEY, authorities)
            .signWith(SignatureAlgorithm.HS512, SIGNING_KEY)
            .setIssuedAt(new Date(System.currentTimeMillis()))
            .setExpiration(new Date(System.currentTimeMillis() + ACCESS_TOKEN_VALIDITY_SECONDS*1000))
            .compact();


0 commentaires

4 Réponses :


0
votes

Cela devrait aider.

Vous devriez être en mesure de récupérer une revendication comme celle-ci dans votre contrôleur

public static ClaimsPrincipal ValidateToken(string jwtToken)
    {
        IdentityModelEventSource.ShowPII = true;

        SecurityToken validatedToken;
        TokenValidationParameters validationParameters = new TokenValidationParameters();

        validationParameters.ValidateLifetime = true;

        validationParameters.ValidAudience = _audience.ToLower();
        validationParameters.ValidIssuer = _issuer.ToLower();
        validationParameters.IssuerSigningKey = new Microsoft.IdentityModel.Tokens.SymmetricSecurityKey(Encoding.UTF8.GetBytes(_appSettings.Secret));

        ClaimsPrincipal principal = new JwtSecurityTokenHandler().ValidateToken(jwtToken, validationParameters, out validatedToken);


        return principal;
    }

Si vous le souhaitez, vous pouvez écrire des méthodes d'extension pour l'IPrincipal et récupérez les revendications en utilisant le code ci-dessus, puis récupérez-les en utilisant (par exemple)

HttpContext.User.Identity.MethodName();

Pour que la réponse soit complète. Pour décoder le jeton JWT, écrivons une méthode pour valider le jeton et extraire les informations.

var identity = HttpContext.User.Identity as ClaimsIdentity;
if (identity != null)
{
    IEnumerable<Claim> claims = identity.Claims; 
    // or
    identity.FindFirst("ClaimName").Value;

}

Nous pouvons maintenant valider et extraire les revendications en utilisant:

ValidateToken (tokenString) ?. FindFirst ("ClaimName") ?. Value

Vous devez noter que la méthode ValidateToken renverra la valeur null si le la validation échoue.


3 commentaires

Y a-t-il une référence disponible pour la réponse que vous avez fournie. Je ne parviens pas à obtenir HttpContext.User.Identity


@sameernainawat Cela ne semble même pas être Java mais du code Kotlin.


@sameernainawat Le as dans HttpContext.User.Identity as ClaimsIdentity n'est pas un mot clé valide en Java. Si vous utilisez autre chose que Java ordinaire, veuillez le dire dans votre question.



1
votes

Voici comment je lis la revendication du jeton

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.web.filter.OncePerRequestFilter;

public class TokenAuthenticationFilter extends OncePerRequestFilter {

    protected final Log logger = LogFactory.getLog(getClass());

    private TokenHelper tokenHelper;

    private UserDetailsService userDetailsService;

    public TokenAuthenticationFilter(TokenHelper tokenHelper, UserDetailsService userDetailsService) {
        this.tokenHelper = tokenHelper;
        this.userDetailsService = userDetailsService;
    }


    @Override
    public void doFilterInternal(
            HttpServletRequest request,
            HttpServletResponse response,
            FilterChain chain
    ) throws IOException, ServletException {

        String username;
        String authToken = tokenHelper.getToken(request);

        logger.info("AuthToken: "+authToken);

        if (authToken != null) {
            // get username from token
            username = tokenHelper.getUsernameFromToken(authToken);
            logger.info("UserName: "+username);
            if (username != null) {
                // get user
                UserDetails userDetails = userDetailsService.loadUserByUsername(username);
                if (tokenHelper.validateToken(authToken, userDetails)) {
                    // create authentication
                    TokenBasedAuthentication authentication = new TokenBasedAuthentication(userDetails);
                    authentication.setToken(authToken);
                    SecurityContextHolder.getContext().setAuthentication(authentication);
                }
            }else{
                logger.error("Something is wrong with Token.");
            }
        }
        chain.doFilter(request, response);
    }



}

J'utilise ceci pour JWT

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.0</version>
</dependency>

Plus de détails ici

Édition 1:

Ajout d'un filtre pour obtenir un jeton de Request et Valider

private Claims getAllClaimsFromToken(String token) {
        Claims claims;
        try {
            claims = Jwts.parser()
                    .setSigningKey(SECRET)
                    .parseClaimsJws(token)
                    .getBody();
        } catch (Exception e) {
            LOGGER.error("Could not get all claims Token from passed token");
            claims = null;
        }
        return claims;
    }


3 commentaires

Comment vais-je obtenir un jeton lorsque l'API est touchée ...?


Si vous voyez le lien que j'ai ajouté. Il existe une classe TokenAuthenticationFilter où j'obtiens un jeton lorsque l'API est touchée. Vous pouvez faire quelque chose de similaire


J'ai vu votre code, mais je n'ai pas obtenu la réponse à ma question: lorsque nous avons frappé l'API, du côté du contrôleur, nous n'obtenons que le principal, les détails, les informations d'identification, les autorités et dans votre code, nous générons un jeton, donc je n'ai pas. t trouve cela lié à ma question.



0
votes

Il serait recommandé de se référer au blog ci-dessous. Il a expliqué comment le jeton JWT fonctionne dans Spring Boot

https://auth0.com/blog/implementing- jwt-authentication-on-spring-boot /


0 commentaires

0
votes

En utilisant Spring Security 5, vous pouvez utiliser le jeton @AuthenticationPrincipal org.springframework.security.oauth2.jwt.Jwt dans votre méthode de contrôleur. Et puis appelez token.getClaims()


0 commentaires