やあ、
私たちは世界中のすべての OSS で作業できるようにしたいと思っていますが、このライブラリはもう積極的には使用していません。これは、新機能やバグ修正などは外部貢献者からのプル リクエストに基づいてのみマージされることを意味します。 、長期的な代替手段を探すことを強くお勧めします。
アクティブにメンテナンスされているライブラリを探している場合は、firebase/php-jwt をチェックしてください。
このライブラリは、JWS (JSON Web Signature) 仕様の軽量実装を提供します。
このライブラリには 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 ' ]);
}
利点: isValid() メソッドの 2 番目の引数は省略できるため、jose はトークンのヘッダーで指定されたアルゴリズムを使用してトークンの検証を試みますが、これによりセキュリティ上の問題が発生する可能性があります。
現時点では、トークンの検証に使用するアルゴリズムを常に明示的に設定することをお勧めします。
OpenSSL 用の PHP ラッパーが機能しない環境、または単に OpenSSL がインストールされていない環境では、このライブラリを使用する必要がある場合があります。このライブラリは、デフォルトで暗号化に OpenSSL を使用しますが、RSA 暗号化の純粋な PHP 実装に PHPSecLib を使用するように指定できます。
このような場合は、JWS を構築するときにオプションの'SecLib'
パラメータを追加するだけです。
$ jws = new JWS ( array ( ' alg ' => ' RS256 ' ), ' SecLib ' );
RSA 署名の PHPSecLib 実装を使用できるようになりました。パスワードで保護された秘密キーを使用する場合でも、 sign
メソッドの 2 番目のパラメーターとしてパスワードを渡す限り、署名に使用する秘密キーを文字列として送信できます。
$ 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 ' ),
));
JWS のロード中に$allowUnsecure
フラグを設定することで、安全でない JWS を許可できます。
JWS :: load ( $ this -> jws -> getTokenString (), true );
これにより、「なし」アルゴリズムで署名されたトークンが通過できるようになりますが、これはおそらく望ましくないことです。慎重に進んでください:)
バージョン 2.2.2 以降、安全でない JWS はデフォルトで無効になっています。 2.2.2 以外の以前のバージョンにはセキュリティ上の脆弱性があるため、使用しないでください。詳細については、こちらをご覧ください。
何らかの理由で、別の方法でトークンをエンコードする必要がある場合は、 JWS
インスタンスにNamshiJOSEBase64Encoder
の実装を挿入できます。同様に、 JWS::load()
そのような実装を 2 番目の引数として受け入れます。
このライブラリは、JSON Web トークンにのみ必要なものを実装する基本 JWT クラスを提供します。次に、JWS クラスは JWT クラスを拡張し、JSON Web 署名を使用して署名および検証するための実装を追加します。 SimpleJWS クラスは、基本 JWS クラスを拡張し、TTL の検証と自動クレームの組み込みを追加します。
暗号化エンジンを指定する機能が導入されました。既存の OpenSSL 実装に PHPSecLib のサポートが追加されました。
ヘッダーにカスタム プロパティを設定する機能が追加されました。特定のクレームの自動組み込みを、基本 JWS クラスから SimpleJWS クラスに移動しました。
phpseclib と openssl 拡張機能を推奨される依存関係として移動しました。
テストは、このライブラリの PHPUnit を使用して作成されます。 Composer のインストールを実行した後、次のコマンドを実行してテストを実行できます。
./vendor/bin/phpunit
このライブラリは、@ritou によって行われた初期の作業からインスピレーションを受けています。