首頁  >  問答  >  主體

使用PHP-JWT實現Epic on FHIR

<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>
P粉593649715P粉593649715437 天前624

全部回覆(1)我來回復

  • P粉037215587

    P粉0372155872023-08-31 14:09:36

    已修復

    • 使用它來代替hash_mac()
    openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA384);
    • 確保金鑰是否儲存在 PHP 變數中,如下格式設定金鑰:
    $privateKey =  "------BEGIN PRIVATE KEY------\n".
    "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC7VJTUt9Us8cKj\n".
    "MzEfYyjiWA4R4/M2bS1GB4t7NXp98C3SC6dVMvDuictGeurT8jNbvJZHtCSuYEvu\n".
    .
    .
    .
    "TQrKhArgLXX4v3CddjfTRJkFWDbE/CkvKZNOrcf1nhaGCPspRJj2KUkj1Fhl9Cnc\n".
    "dn/RsYEONbwQSjIfMPkvxF+8HQ==\n".
    "------END PRIVATE KEY------";

    將每一行用雙引號""#括起來,並在每行末尾加上\n。 < /p>

    回覆
    0
  • 取消回覆