<p>我正在尝试获取 jwt 令牌,但每次我尝试的所有操作都会出现错误。以下是我尝试过的事情。我确实在没有包的情况下获得了 jwt-token,但是当我使用 jwt.io 检查签名验证时,每次都会失败。使用该软件包时,我遇到了不同的错误,例如<em>私钥无法强制执行</em>,有时<em>算法无效</em>。请纠正我哪里搞砸了。</p>
<ul>
<li><strong>没有 php-Jwt</strong></li>
</ul>
<pre class="brush:php;toolbar:false;">$header = [
'alg' => "RS384",
'typ' => "JWT"
];
$payload = [
'iss' => 'my-client-id',
'sub' => 'my-client-id',
'aud' => "https://fhir.epic.com/interconnect-fhir-oauth/oauth2/token",
'jti' => (string)strtotime(gmdate("Y-m-d H:i:s")),
'exp' => strtotime(gmdate("Y-m-d H:i:s")) + 270,
];
$privateKey = "my private Key"
$headers_encoded = $this->base64url_encode(json_encode($header));
$payload_encoded = $this->base64url_encode(json_encode($payload));
$signature = hash_hmac('sha384', $headers_encoded.'.'.$payload_encoded, $privateKey, true);
// Encode the signature as a base64url string
$signature_encoded = $this->base64url_encode($signature);
$jwt = $headers_encoded.'.'.$payload_encoded.'.'.$signature_encoded;</pre>
<p><strong>- 使用 php-jwt</strong></p>
<ol>
<li>安装了该软件包
<em>作曲家需要 firebase/php-jwt --ignore-platform-req=ext-mongodb</em></li>
<li>在我的控制器中使用了所需的文件</li>
</ol>
<pre class="brush:php;toolbar:false;">use Firebase\JWT\JWT;
use Firebase\JWT\Key;</pre>
<ol start="3">
<li>尝试编码:</li>
</ol>
<pre class="brush:php;toolbar:false;">$check = JWT::encode(
$header,
$payload,
$privateKey,
'RS384'
);</pre>
<p>我收到不同的错误,例如<em>无法强制执行私钥</em>,有时<em>算法无效</em>。请纠正我哪里搞砸了。</p>
<p>简单来说,这就是我正在做或正在尝试做的事情。我的代码的通用形式:</p>
'智威汤逊'
];
$有效负载= [
'子' => '1234567890',
'名字' => “约翰·多伊”,
'iat'=> 1516239022
];
// 将标头和负载编码为 JSON 字符串
$headerEncoded = base64_encode(json_encode($header));
$payloadEncoded = base64_encode(json_encode($payload));
// 连接标头、有效负载和秘密以创建签名
$signature = hash_hmac('sha384', "$headerEncoded.$payloadEncoded", $privateKey, true);
// 将签名编码为base64字符串
$signatureEncoded = base64_encode($signature);
// 连接标头、有效负载和签名以创建 JWT
$jwt =“$headerEncoded.$payloadEncoded.$signatureEncoded”;
回声 $jwt;</pre>
<p>我确实得到了 jwt 签名,但在 https://jwt.io/ 上显示未验证。</p>
已修复
将每一行用双引号
""
括起来,并在每行末尾添加\n
。