Estoy trabajando en una aplicación web desarrollada en Java y AngularJS y eligió la implementación de token de autenticación y autorización.
Para el ejercicio de propósito, he llegado al punto donde puedo enviar las credenciales para el servidor, generar un token aleatorio de la tienda y la envía de vuelta al cliente.
En cada petición al servidor estoy adjuntando el token en el encabezado y funciona perfectamente.
Para la autenticación de punto de vista es perfecto y no necesita más.

Sin embargo, ahora quiero seguir la pista de el tipo de usuario (administrador, usuario habitual…), así como su id, o cualquier otro campo único; por lo que he entendido que tengo para cifrar que en el token que yo voy a enviar de vuelta al cliente durante el registro en la acción. Es eso correcto?

Hay alguna JWT biblioteca que utiliza y puede generar, cifrar y descifrar esos símbolos?
Un enlace a la biblioteca de la API y Maven de la dependencia sería muy apreciada.

Gracias

  • Si la información que se desea almacenar en el token no es sensible que no necesariamente se debe cifrar el token. Es un identificador de usuario y permisos de algo secreto? Probablemente no. Lo que usted necesita para asegurarse de que sólo puede crear un token válido. La jwt enfoque es tener el token firmado digitalmente con Hmac y un secreto de la clave de firma para asegurarse de que usted será capaz de comprobar su integridad y procedencia. Mi respuesta, a continuación, ofrece una biblioteca y un ejemplo.
  • Hola.. estoy tratando de implementar este JWT biblioteca y también lo hice en el lado del servidor ( Java ), pero ¿cómo puedo decodificar en mi frente el lado extremo ( javascript)? La biblioteca se utiliza para decodificar en el angularjs parte?
  • Thiago, yo no. El flujo fue de la siguiente manera: el Usuario se registra en -> datos enviados al servidor -> token creado -> enviado de vuelta al cliente. Cuando una solicitud se realiza en el servidor, el token se anexa en el encabezado (he implementado un interceptor para esto). La validación se realiza en el servidor y la respuesta correcta fue enviado de vuelta (si fue autorizado o no).
  • Una página muy útil cuando se trata con JWT: jwt.io
  • El token que usted está enviando angular es el mismo token recibido desde el servidor?? Estoy trabajando en la misma parte…por favor ayuda
  • También se preguntan, ¿por Qué no están decodificando el token en el extremo frontal angular cuando usted lo recibe desde el servidor. No es necesario para decodificar?

9 Comentarios

  1. 49

    JJWT pretende ser el más fácil de entender y de usar JWT biblioteca para la JVM y Android:

    https://github.com/jwtk/jjwt

    • Simple, sencillo y limpio, y funcionó de inmediato. Me fui para el Google JsonToken primera y cambiado aquí después de jugar con las dependencias no resueltas y las páginas de código para armar un simple JWT.
    • ¿Cómo puedo prevenir el token de robo?
    • ¿Cómo puedo manejar tiempo de espera de señal como en nodejs-jsonwebtoken
    • Soy capaz de utilizar jjwt en un simple programa de prueba. Pero cuando trato de usar en mi dropwizard aplicación me sale el siguiente error en el inicio: java.lang.NoSuchFieldError: WRITE_DURATIONS_AS_TIMESTAMPS. Los pensamientos?
    • «¿Cómo puedo prevenir el token de robo» – yo no puedo pensar en nada pero SSL
    • «¿Cómo puedo manejar tiempo de espera de señal» – Por jwt especificaciones que usted necesita para establecer el «exp», afirman. Jjwt proporciona un conveniente «setExpiration» método para esto.
    • Su problema no era de Jackson discrepancia de versiones. jjwt depende de Jackson y es muy probable que tengas una versión anterior en algún lugar en el proyecto que está causando un conflicto.
    • ¿Cómo puedo verificar la firma de token recibido desde el cliente?
    • si no se lanza una excepción durante el análisis, se comprueba la firma.
    • JJWT no admite JWE (Cifrado para JWT) (vale la pena saber en caso de que alguien necesite)
    • es en las obras y casi completa. Será en el JJWT 0.7 liberación. Sucursal aquí: github.com/jwtk/jjwt/tree/jwe Además, el archivo léame siempre dirá lo que es o no es compatible.
    • He probado. He utilizado la tecla «secret123» a cantar y «secret124» a veryfiy, y lo tengo comprobado.
    • eso es porque usted estaba utilizando no válido inseguro Base64 claves. Esto se explica aquí: github.com/jwtk/jjwt/issues/211#issuecomment-283076269
    • Una advertencia acerca de esto. Hay un montón de gente que tiene problemas con el tiempo de ejecución de la resolución de dependencia. Todavía no entiendo por qué el autor no podría haber tomado la biblioteca como cualquier otro normal de la biblioteca por ahí. Terminé con algo más porque el autor siguió insistiendo en que la configuración se ha equivocado. Pero yo tenía configurado exactamente como lo hizo en GitHub. Retraso de mi proyecto por un par de días o así.
    • no hay ‘mucha gente’. Hay literalmente miles de JJWT usuarios y hemos recibido sólo alrededor de 3 o 4 informes. Estoy 100% feliz para arreglar lo que no puede ser malo si se puede apuntar a un proyecto de ejemplo que muestra el problema. Simplemente no se puede repetir.
    • Estoy usando github.com/auth0/java-jwt y funciona incluso mejor. No extraña esotérico de la mazmorra de la brujería.
    • El Auth0 JWT biblioteca tiene una historia de agujeros de seguridad. Quizás esté todo resuelto ahora, tal vez no, pero yo y muchos otros no confían en él debido a su historial de seguridad. Diviértete con eso!
    • href=»https://jwt.io/» >jwt.io. Estoy seguro que les han emitido una advertencia de no ver como es en la pared de la fama.

  2. 22

    Si alguien en la necesidad de una respuesta,

    He utilizado esta biblioteca: http://connect2id.com/products/nimbus-jose-jwt
    Maven aquí: http://mvnrepository.com/artifact/com.nimbusds/nimbus-jose-jwt/2.10.1

    • Por favor, asegúrese de usar la versión más reciente. La biblioteca está continuamente revisados & mejorado y nuevos algoritmos / características se añaden: mvnrepository.com/artifact/com.nimbusds/nimbus-jose-jwt a partir de la versión 3.2 con todos los estándares de los testigos de jehová de la firma de los algoritmos como totalmente compatibles, así como todos los JWE de algoritmos de cifrado, guardar para PBES2 y ECDH-ES.
    • Recibo el siguiente error: java.lang.NoSuchMethodError: org.apache.commons.códec.binario.Base64.decodeBase64
    • El problema anterior está documentado aquí bitbucket.org/connect2id/nimbus-jose-jwt/issue/52/… . He resuelto el problema modificando el byte[] decode() methd en com.nimbusds.jose.util.Base64Url utilizar el android.util.Base64.decodificar método. Es esta la forma correcta?
    • En la versión 2.24 nos cambiamos de Apache Commons Codec interno de utilidad para manejar la codificación BASE64 + decodificación. Con que el problema de Android con el códec ha sido resuelto satisfactoriamente. Ver tema bitbucket.org/connect2id/nimbus-jose-jwt/issue/63 para más detalles. Además, usted debe obtener un rendimiento aún mejor ahora 🙂
    • Hola, estoy empezando con angularjs + java de la autenticación mediante JWT. Podría usted por favor me guía o mostrar un código de ejemplo de cómo lograr esto?
    • Tengo classdefnotfound error en Base64Url

  3. 13

    Esta biblioteca parece funcionar bien: https://code.google.com/p/jsontoken/ .

    Depende de Google Guayaba. Aquí están las Maven artefactos:

    <dependency>
        <groupId>com.googlecode.jsontoken</groupId>
        <artifactId>jsontoken</artifactId>
        <version>1.0</version>
    </dependency>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>18.0</version>
    </dependency>

    La biblioteca es de hecho utilizado por Google Wallet.

    Aquí es cómo crear una jwt, y para verificar y deserializar es:

    import java.security.InvalidKeyException;
    import java.security.SignatureException;
    import java.util.Calendar;
    import java.util.List;
    import net.oauth.jsontoken.JsonToken;
    import net.oauth.jsontoken.JsonTokenParser;
    import net.oauth.jsontoken.crypto.HmacSHA256Signer;
    import net.oauth.jsontoken.crypto.HmacSHA256Verifier;
    import net.oauth.jsontoken.crypto.SignatureAlgorithm;
    import net.oauth.jsontoken.crypto.Verifier;
    import net.oauth.jsontoken.discovery.VerifierProvider;
    import net.oauth.jsontoken.discovery.VerifierProviders;
    import org.apache.commons.lang3.StringUtils;
    import org.bson.types.ObjectId;
    import org.joda.time.DateTime;
    import com.google.common.collect.Lists;
    import com.google.gson.JsonObject;
    /**
    * Provides static methods for creating and verifying access tokens and such. 
    * @author davidm
    *
    */
    public class AuthHelper {
    private static final String AUDIENCE = "NotReallyImportant";
    private static final String ISSUER = "YourCompanyOrAppNameHere";
    private static final String SIGNING_KEY = "[email protected]^($%*$%";
    /**
    * Creates a json web token which is a digitally signed token that contains a payload (e.g. userId to identify 
    * the user). The signing key is secret. That ensures that the token is authentic and has not been modified.
    * Using a jwt eliminates the need to store authentication session information in a database.
    * @param userId
    * @param durationDays
    * @return
    */
    public static String createJsonWebToken(String userId, Long durationDays)    {
    //Current time and signing algorithm
    Calendar cal = Calendar.getInstance();
    HmacSHA256Signer signer;
    try {
    signer = new HmacSHA256Signer(ISSUER, null, SIGNING_KEY.getBytes());
    } catch (InvalidKeyException e) {
    throw new RuntimeException(e);
    }
    //Configure JSON token
    JsonToken token = new net.oauth.jsontoken.JsonToken(signer);
    token.setAudience(AUDIENCE);
    token.setIssuedAt(new org.joda.time.Instant(cal.getTimeInMillis()));
    token.setExpiration(new org.joda.time.Instant(cal.getTimeInMillis() + 1000L * 60L * 60L * 24L * durationDays));
    //Configure request object, which provides information of the item
    JsonObject request = new JsonObject();
    request.addProperty("userId", userId);
    JsonObject payload = token.getPayloadAsJsonObject();
    payload.add("info", request);
    try {
    return token.serializeAndSign();
    } catch (SignatureException e) {
    throw new RuntimeException(e);
    }
    }
    /**
    * Verifies a json web token's validity and extracts the user id and other information from it. 
    * @param token
    * @return
    * @throws SignatureException
    * @throws InvalidKeyException
    */
    public static TokenInfo verifyToken(String token)  
    {
    try {
    final Verifier hmacVerifier = new HmacSHA256Verifier(SIGNING_KEY.getBytes());
    VerifierProvider hmacLocator = new VerifierProvider() {
    @Override
    public List<Verifier> findVerifier(String id, String key){
    return Lists.newArrayList(hmacVerifier);
    }
    };
    VerifierProviders locators = new VerifierProviders();
    locators.setVerifierProvider(SignatureAlgorithm.HS256, hmacLocator);
    net.oauth.jsontoken.Checker checker = new net.oauth.jsontoken.Checker(){
    @Override
    public void check(JsonObject payload) throws SignatureException {
    //don't throw - allow anything
    }
    };
    //Ignore Audience does not mean that the Signature is ignored
    JsonTokenParser parser = new JsonTokenParser(locators,
    checker);
    JsonToken jt;
    try {
    jt = parser.verifyAndDeserialize(token);
    } catch (SignatureException e) {
    throw new RuntimeException(e);
    }
    JsonObject payload = jt.getPayloadAsJsonObject();
    TokenInfo t = new TokenInfo();
    String issuer = payload.getAsJsonPrimitive("iss").getAsString();
    String userIdString =  payload.getAsJsonObject("info").getAsJsonPrimitive("userId").getAsString();
    if (issuer.equals(ISSUER) && !StringUtils.isBlank(userIdString))
    {
    t.setUserId(new ObjectId(userIdString));
    t.setIssued(new DateTime(payload.getAsJsonPrimitive("iat").getAsLong()));
    t.setExpires(new DateTime(payload.getAsJsonPrimitive("exp").getAsLong()));
    return t;
    }
    else
    {
    return null;
    }
    } catch (InvalidKeyException e1) {
    throw new RuntimeException(e1);
    }
    }
    }
    public class TokenInfo {
    private ObjectId userId;
    private DateTime issued;
    private DateTime expires;
    public ObjectId getUserId() {
    return userId;
    }
    public void setUserId(ObjectId userId) {
    this.userId = userId;
    }
    public DateTime getIssued() {
    return issued;
    }
    public void setIssued(DateTime issued) {
    this.issued = issued;
    }
    public DateTime getExpires() {
    return expires;
    }
    public void setExpires(DateTime expires) {
    this.expires = expires;
    }
    }

    Este está basado en el código aquí: https://developers.google.com/wallet/instant-buy/about-jwts
    Y Aquí: https://code.google.com/p/wallet-online-sample-java/source/browse/src/com/google/wallet/online/jwt/util/WalletOnlineService.java?r=08b3333bd7260b20846d7d96d3cf15be8a128dfa

    • Esta biblioteca utiliza 1000s de las dependencias, todos los cuales necesitan ser resueltos, compilado y hacer un gran lío de su proyecto. ¿Por qué no utilizan principalmente lo que está disponible en Java?
    • No 1000s, es de menos de 20 años de dependencias , y funciona para mí.
    • es este lib sigue activo ??
    • No se puede descargar el proyecto. Conseguir un 401
  4. 12

    Refiriéndose a https://jwt.io/ usted puede encontrar jwt implementaciones en varios idiomas incluyendo el java. También el sitio de proporcionar una comparación entre estos ejecución (los algoritmos que apoyo y ….).

    Para java estas se mencionan las bibliotecas:

    • Gracias, me ayudó a encontrar JWT plugin para mi jugar el marco de la aplicación
    • ¿cómo ustedes elegir cuál utilizar? ¿Y si todos los 4 las bibliotecas cubrirá todas mis casos de uso?
    • Vaya con lo que parece más sencillo de implementar. Si todas las implementaciones parecen ser griego, vaya con el uno con el mejor nombre. Esto ha funcionado bien para mí.
  5. 7

    IETF ha propuesto josé libs en la wiki:
    http://trac.tools.ietf.org/wg/jose/trac/wiki

    Yo recomendaría el uso de ellos para la firma. Yo no soy un Java chico, pero parece jose4j parece una buena opción. Ha niza ejemplos así: https://bitbucket.org/b_c/jose4j/wiki/JWS%20Examples

    Actualización: jwt.io ofrece una cuidada comparación de varios jwt relacionados
    las bibliotecas y sus características. Una debe comprobar!

    Me encantaría escuchar lo que otros desarrolladores java prefiere.

  6. 2

    https://github.com/networknt/jsontoken

    Este es un tenedor de la original de google jsontoken

    No ha sido actualizado desde Sep 11, 2012 y depende de algunos paquetes antiguos.

    Lo que he hecho:

    Convert from Joda time to Java 8 time. So it requires Java 8.
    Covert Json parser from Gson to Jackson as I don't want to include two Json parsers to my projects.
    Remove google collections from dependency list as it is stopped long time ago.
    Fix thread safe issue with Java Mac.doFinal call.

    Todas las pruebas de unidad pasado junto con algunos recién agregado de los casos de prueba.

    Aquí es un ejemplo para generar el token y verificar el token. Para obtener más información, por favor revise https://github.com/networknt/light código fuente para su uso.

    Yo soy el autor de los dos jsontoken y Omni-Canal del Marco de la Aplicación.

  7. 2

    Si sólo se necesita analizar unsigned sin cifrar las fichas que usted podría utilizar este código:

    boolean parseJWT_2() {
    String authToken = getToken();
    String[] segments = authToken.split("\\.");
    String base64String = segments[1];
    int requiredLength = (int)(4 * Math.ceil(base64String.length() / 4.0));
    int nbrPaddings = requiredLength - base64String.length();
    if (nbrPaddings > 0) {
    base64String = base64String + "====".substring(0, nbrPaddings);
    }
    base64String = base64String.replace("-", "+");
    base64String = base64String.replace("_", "/");
    try {
    byte[] data = Base64.decode(base64String, Base64.DEFAULT);
    String text;
    text = new String(data, "UTF-8");
    tokenInfo = new Gson().fromJson(text, TokenInfo.class);
    } catch (Exception e) {
    e.printStackTrace();
    return false;
    }
    return true;
    }

Dejar respuesta

Please enter your comment!
Please enter your name here