안녕하세요,
우리는 전 세계의 모든 OSS에 대해 작업할 수 있기를 바라지만 더 이상 이 라이브러리를 적극적으로 사용하지 않습니다. 즉, 새로운 기능/버그 수정 등은 외부 기여자의 풀 요청에 따라서만 병합됩니다. , 장기적인 대안을 찾는 것이 좋습니다.
적극적으로 유지 관리되는 라이브러리를 찾고 있다면 firebase/php-jwt를 확인하세요!
이 라이브러리는 JWS(JSON 웹 서명) 사양의 경량 구현을 제공합니다.
이 라이브러리에는 PHP 5.5+ 및 OpenSSL 라이브러리가 필요합니다.
PHP5.5
~ PHP7.0
및 HHVM
사용하여 테스트되었습니다.
Composer/Packagist에서 직접 라이브러리를 설치할 수 있습니다.
"namshi/jose": "7.0.*"
이를 사용하는 것은 매우 간단합니다. 서비스에 쿠키를 통해 사용자를 인증하는 기능을 제공하려고 하며 서비스가 자바스크립트로 구축되어 있다고 가정해 보세요. 당신이 해야 할 일은 JWS를 생성하고(자격 증명을 한 번 확인한 후) 쿠키로 저장한 다음 해당 사용자를 인증할 때마다 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 앱은 사용 가능한 쿠키를 사용하여 비밀번호나 자격 증명을 보내지 않고도 인증된 호출을 실행할 수 있습니다.
요청이 제출되면 유효한 호출인지 확인하기만 하면 됩니다.
<?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() 메서드의 두 번째 인수를 생략할 수 있으므로 jose는 토큰 헤더에 지정된 알고리즘을 사용하여 토큰의 유효성을 검사하려고 시도합니다. 단, 이로 인해 일부 보안 문제가 발생할 수 있습니다.
지금은 토큰 검증에 사용하려는 알고리즘을 항상 명시적으로 설정하는 것이 좋습니다.
OpenSSL용 PHP 래퍼가 작동하지 않거나 OpenSSL이 설치되지 않은 환경에서 이 라이브러리를 사용해야 할 수도 있습니다. 이 라이브러리는 기본적으로 OpenSSL을 사용하여 암호화하지만 RSA 암호화의 순수 PHP 구현을 위해 PHPSecLib을 사용하도록 지정할 수 있습니다.
이러한 경우 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 ' ),
));
JWS를 로드하는 동안 $allowUnsecure
플래그를 설정하여 안전하지 않은 JWS를 허용할 수 있습니다.
JWS :: load ( $ this -> jws -> getTokenString (), true );
이를 통해 '없음' 알고리즘으로 서명된 토큰이 통과할 수 있는데, 이는 아마도 원하지 않는 일입니다. 주의해서 진행하세요 :)
안전하지 않은 JWS는 버전 2.2.2부터 기본적으로 비활성화되어 있습니다. 2.2.2 이외의 이전 버전에는 보안 취약점이 있으므로 사용하지 마십시오. 자세한 내용은 여기를 참조하세요.
어떤 이유로든 토큰을 다른 방식으로 인코딩해야 하는 경우 JWS
인스턴스에 NamshiJOSEBase64Encoder
구현을 삽입할 수 있습니다. 마찬가지로 JWS::load()
이러한 구현을 두 번째 인수로 허용합니다.
라이브러리는 JSON 웹 토큰에 필요한 것을 구현하는 기본 JWT 클래스를 제공합니다. 그런 다음 JWS 클래스는 JWT 클래스를 확장하고 JSON 웹 서명을 사용하여 서명 및 확인하기 위한 구현을 추가합니다. SimpleJWS 클래스는 기본 JWS 클래스를 확장하고 TTL 검증 및 자동 청구 포함을 추가합니다.
암호화 엔진을 지정하는 기능이 도입되었습니다. 기존 OpenSSL 구현에 PHPSecLib 지원이 추가되었습니다.
헤더에 사용자 정의 속성을 설정하는 기능이 추가되었습니다. 특정 클레임의 자동 포함을 기본 JWS 클래스에서 SimpleJWS 클래스로 이동했습니다.
phpseclib 및 openssl 확장을 제안된 종속성으로 이동했습니다.
테스트는 이 라이브러리에 대해 PHPUnit을 사용하여 작성되었습니다. 작곡가 설치를 수행한 후 다음 명령을 실행하여 테스트를 실행할 수 있습니다.
./vendor/bin/phpunit
이 라이브러리는 @ritou의 초기 작업에서 영감을 받았습니다.