你好呀,
儘管我們希望能夠在世界上所有的 OSS 上工作,但我們不再主動使用這個庫這意味著新功能/錯誤修復/等將僅根據外部貢獻者的拉取請求進行合併,我們強烈建議您尋找長期替代方案。
如果您正在尋找一個積極維護的程式庫,請檢查 firebase/php-jwt!
該程式庫提供了 JWS(JSON Web 簽章)規範的輕量級實作。
該函式庫需要 PHP 5.5+ 和 OpenSSL 函式庫。
它已經使用PHP5.5
到PHP7.0
和HHVM
進行了測試。
您可以直接從composer / packagist安裝該程式庫:
"namshi/jose": "7.0.*"
使用它非常簡單:假設您想要提供一項服務,使其能夠透過 cookie 對使用者進行身份驗證,並且該服務是使用 javascript 建立的;您需要做的是產生一個 JWS(驗證一次憑證後),將其儲存為 cookie,然後每次您想要驗證該使用者時從 JavaScript 應用程式傳遞它。
首先,生成JWS:
<?php
use Namshi JOSE SimpleJWS ;
if ( $ username == ' correctUsername ' && $ pass == ' ok ' ) {
$ user = Db :: loadUserByUsername ( $ username );
$ jws = new SimpleJWS ( array (
' alg ' => ' RS256 '
));
$ jws -> setPayload ( array (
' uid ' => $ user -> getid (),
));
$ privateKey = openssl_pkey_get_private ( " file://path/to/private.key " , self :: SSL_KEY_PASSPHRASE );
$ jws -> sign ( $ privateKey );
setcookie ( ' identity ' , $ jws -> getTokenString ());
}
然後,您的 JS 應用程式可以使用可用的 cookie 來執行經過驗證的調用,而無需發送密碼或憑證。
提交請求後,您只需驗證它是否是有效的呼叫:
<?php
use Namshi JOSE SimpleJWS ;
$ jws = SimpleJWS :: load ( $ _COOKIE [ ' identity ' ]);
$ public_key = openssl_pkey_get_public ( " /path/to/public.key " );
// verify that the token is valid and had the same values
// you emitted before while setting it as a cookie
if ( $ jws -> isValid ( $ public_key , ' RS256 ' )) {
$ payload = $ jws -> getPayload ();
echo sprintf ( " Hey, my JS app just did an action authenticated as user #%s " , $ payload [ ' uid ' ]);
}
PROTIP:您可以省略 isValid() 方法的第二個參數,因此 jose 將嘗試使用令牌標頭中指定的演算法來驗證令牌,儘管這可能會讓您遇到一些安全問題。
目前,我們建議始終明確設定要用於驗證令牌的演算法。
您可能會發現需要在 PHP 的 OpenSSL 包裝器無法運作或根本未安裝 OpenSSL 的環境中使用此程式庫。該程式庫預設使用 OpenSSL 進行加密,但您可以指定要使用 PHPSecLib 進行 RSA 加密的純 PHP 實作。
在這些情況下,只需在建構 JWS 時新增可選的'SecLib'
參數:
$ jws = new JWS ( array ( ' alg ' => ' RS256 ' ), ' SecLib ' );
現在您可以使用 RSA 簽署的 PHPSecLib 實作。如果您使用受密碼保護的私鑰,您仍然可以將私鑰作為字串提交用於簽名,只要將密碼作為第二個參數傳遞到sign
方法中即可:
$ jws -> sign ( file_get_contents ( SSL_KEYS_PATH . " private.key " ), ' tests ' );
您也可以使用 RSA 驗證的 PHPSecLib 實作載入 JWS:
$ jws = JWS :: load ( $ tokenString , false , $ encoder , ' SecLib ' );
為了驗證 JWS,首先使用公鑰驗證簽名,然後我們將檢查令牌是否過期。
要為 JWS 提供 TTL,只需在有效負載中使用標準exp
值:
$ date = new DateTime ( ' tomorrow ' );
$ this -> jws = new SimpleJWS ( array ( ' alg ' => ' RS256 ' ));
$ this -> jws -> setPayload ( array (
' exp ' => $ date -> format ( ' U ' ),
));
您可以透過在載入 JWSes 時設定$allowUnsecure
標誌來允許不安全的 JWSes:
JWS :: load ( $ this -> jws -> getTokenString (), true );
這允許使用“無”演算法簽署的令牌通過,這是您可能不想做的事情。謹慎行事:)
從 2.2.2 版本開始,不安全的 JWS 預設會被停用。您不應使用 2.2.2 以外的早期版本,因為它們有安全漏洞。更多資訊請點這裡。
如果由於某種原因,您需要以不同的方式對令牌進行編碼,則可以在JWS
實例中註入NamshiJOSEBase64Encoder
的任何實作。同樣, JWS::load()
接受這樣的實作作為第二個參數。
該庫提供了一個基本 JWT 類,它實作了 JSON Web 令牌所需的功能。然後,JWS 類別會擴充 JWT 類別並新增使用 JSON Web 簽章進行簽章和驗證的實作。 SimpleJWS 類別擴展了 JWS 基類,並加入了 TTL 驗證和自動聲明的包含。
引入了指定加密引擎的功能。在現有 OpenSSL 實作中新增了對 PHPSecLib 的支援。
新增了在標頭中設定自訂屬性的功能。將某些聲明從 JWS 基底類別自動包含到 SimpleJWS 類別中。
將 phpseclib 和 openssl 擴展移動為建議的依賴項。
測試是使用 PHPUnit 為該庫編寫的。完成 Composer 安裝後,您可以執行以下命令來執行測試:
./vendor/bin/phpunit
該庫的靈感來自@ritou 所做的初始工作。