【发布时间】:2020-03-29 03:14:00
【问题描述】:
我正在使用 PHP 中的私钥创建 JWT 令牌。为此,我正在使用 OpenSSL 库。 在此之前,我将分享我的代码:
PHP
$header = [
self::ALG => self::RS256,
self::TYP => self::JWT
];
$payload = [
"iss" => $this->getClientID(),
"iat" => time(),
"exp" => time()+999
];
$header = base64_encode(json_encode($header));
$payload = base64_encode(json_encode($payload));
$token = $header.".".$payload;
$pkey = openssl_pkey_get_private($this->getPrivateKey(), $this->getPassPhrase());
openssl_sign($token, $signature, $pkey, 'sha256'); //no algorithm specifically for rs256
$sign = base64_encode($signature);
return $token.".".$sign;
因此,此 JWT 令牌将用于在我尝试访问的服务器中进行身份验证。但是我从外部服务器收到了Bad Request 的响应,我的 JWT 令牌创建中出现了问题。
使用相同的凭据,我尝试使用库jsrsasign 使用javascript,然后它给了我正确的响应。
JAVASCRIPT
// Header
var oHeader = { alg: 'RS256', typ: 'JWT' };
// Payload
var oPayload = {};
var tNow = rs.KJUR.jws.IntDate.get('now');
var tEnd = tNow + 1000;
oPayload.iss = "playground.pizza";
oPayload.iat = tNow;
oPayload.exp = tEnd;
var sHeader = JSON.stringify(oHeader);
var sPayload = JSON.stringify(oPayload);
var pkey = "my private key" //I replaced all the new line with \n here and had in one line
var prvKey = rs.KEYUTIL.getKey(pkey, "my_pass_phrase");
var sJWT = rs.KJUR.jws.JWS.sign("RS256", sHeader, sPayload, prvKey);
ultraSecureToken = sJWT;
我可以清楚地看到一个区别是,对于 php 端的 signature generation function,我将 sha256 作为算法传递,而在 JavaScript 中传递 RS256。
我了解到 sha256 只是一种散列算法,而 RS256 用于编码,但在我在 php 中找到的所有库中,它们在内部仅在 openssl_sign 函数中传递 sha256。而且openssl_sign没有RS256作为算法参数。
那么,首先我哪里出错了。
其次,有没有一种方法可以在 php.ini 中使用 RS256 生成签名。
PS:我正在寻找 php 中的解决方案。
【问题讨论】: