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/OAuth 令牌签名验证失败

使用 JWT PHP 库导致“签名验证失败”的网站的 Google 登录

签名验证失败 - Apple 使用 Firebase JWT 登录

Firebase JWT:签名验证失败

使用 PyJWT 的 Jwt 解码引发签名验证失败

ASP.NET JWT:签名验证失败。没有提供安全密钥来验证签名