JWT签名验证失败,java到php

时间:2016-08-20 15:15:03

标签: java php json web jwt

我与您分享第一个代码

php代码 http://pastebin.com/b8TNfyzq第22行

JwtTester.java http://pastebin.com/TsF0wsCX第22行

我在php服务器上编写的java代码创建的令牌与令牌不匹配。 虽然我无法在双方验证相同的密钥

我在java代码中使用github.com/jwtk/jjwt 和php代码中的github.com/firebase/php-jwt

与密钥中的java代码和数据相同,当我仅在PHP中创建令牌时,由不同的令牌组成

2 个答案:

答案 0 :(得分:0)

是格式转换问题。 jjwt需要在base64中编码的密钥,php-jwt使用普通字符串

Jjwt JwtBuilder

JwtBuilder signWith(SignatureAlgorithm alg, String base64EncodedSecretKey);

Php-jwt JWT

 /**
 * Decodes a JWT string into a PHP object.
 *
 * @param string        $jwt            The JWT
 * @param string|array  $key            The key, or map of keys.
 *                                      If the algorithm used is asymmetric, this is the public key
public static function decode($jwt, $key, $allowed_algs = array()

在调用JwtBuilder.signWith

之前,在base64中对您的密钥进行编码
builder.signWith(SignatureAlgorithm.HS256, 
                               DatatypeConverter.printBase64Binary(key));

答案 1 :(得分:0)

针对仍面临问题的人们。 如果要从Java创建jwt,则将“ typ”标头添加到它,由PHP-jwt检查。另外,jjwt也将密钥编码为base64,因此是从Java

String jwtSecret = "yoursecret";

Map<String, Object> header = new HashMap<>();
header.put("typ", Header.JWT_TYPE);

String jwt = Jwts.builder()
                    .setHeader(header)
                    .setSubject("someclaim")
                    .setIssuedAt(new Date())
                    .setExpiration(expiryDate)
                    .signWith(SignatureAlgorithm.HS512,TextCodec.BASE64.encode(jwtSecret))
                    .compact();

在php

define('SECRET', 'yoursecret');
$decoded = (array) JWT::decode($jwt,SECRET, array('HS512'));

如果机密包含特殊字符,似乎也无法正确解码。