JWT 签名验证失败,java 到 php
Posted
技术标签:
【中文标题】JWT 签名验证失败,java 到 php【英文标题】:JWT Signature verification failed , java to php 【发布时间】:2016-12-27 14:18:35 【问题描述】:我与你分享第一个代码
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 代码和 key 中的数据相同,当我仅在 PHP 中创建令牌时由不同的令牌组成
【问题讨论】:
不要链接代码。复制代码 【参考方案1】:是格式转换问题。 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));
【讨论】:
【参考方案2】:对于仍然面临这个问题的人。 如果您是从 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'));
如果秘密包含特殊字符,它似乎也无法正确解码。
【讨论】:
以上是关于JWT 签名验证失败,java 到 php的主要内容,如果未能解决你的问题,请参考以下文章
使用 JWT PHP 库导致“签名验证失败”的网站的 Google 登录