簡體   English   中英

JWT簽名驗證失敗,Java至PHP

[英]JWT Signature verification failed , java to php

我與您分享第一個密碼

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中創建令牌時由不同的令牌組成

是格式轉換問題。 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));

對於仍然面臨該問題的人們。 如果要從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'));

此外,如果機密包含特殊字符,似乎也無法正確解碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM