Всем привет,
как бы нам ни хотелось иметь возможность работать со всеми OSS в мире, мы больше не используем эту библиотеку активно. Это означает, что новые функции/исправления ошибок/и т. д. будут объединяться только на основе запросов на включение от внешних участников. , и мы настоятельно рекомендуем вам поискать долгосрочную альтернативу.
Если вы ищете активно поддерживаемую библиотеку, проверьте firebase/php-jwt!
Эта библиотека предоставляет упрощенную реализацию спецификации JWS (веб-подпись JSON).
Для этой библиотеки требуется PHP 5.5+ и библиотека OpenSSL.
Он был протестирован с использованием PHP5.5
– PHP7.0
и HHVM
.
Вы можете установить библиотеку напрямую от композитора/упаковщика:
"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(), тогда jose попытается проверить токен с помощью алгоритма, указанного в заголовке токена, хотя это может подвергнуть вас некоторым проблемам с безопасностью.
На данный момент мы рекомендуем всегда явно указывать алгоритм, который вы хотите использовать для проверки токенов.
Вы можете обнаружить, что вам необходимо использовать эту библиотеку в среде, где оболочки PHP для OpenSSL не работают или OpenSSL просто не установлен. Эта библиотека по умолчанию использует OpenSSL для шифрования, но вы можете указать, что хотите использовать PHPSecLib для реализации шифрования RSA на чистом PHP.
В этих случаях просто добавьте дополнительный параметр 'SecLib'
при создании JWS:
$ jws = new JWS ( array ( ' alg ' => ' RS256 ' ), ' SecLib ' );
Теперь вы можете использовать реализацию подписи RSA в PHPSecLib. Если вы используете закрытый ключ, защищенный паролем, вы все равно можете отправить закрытый ключ для подписи в виде строки, если вы передаете пароль в качестве второго параметра в метод sign
:
$ jws -> sign ( file_get_contents ( SSL_KEYS_PATH . " private.key " ), ' tests ' );
Вы также можете загрузить JWS, используя реализацию проверки RSA PHPSecLib:
$ 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 );
Это позволяет проходить токенам, подписанным с помощью алгоритмов «none», чего вы, вероятно, не захотите делать. Действуйте осторожно :)
Незащищенные JWS по умолчанию отключены, начиная с версии 2.2.2. Не следует использовать предыдущие версии, кроме 2.2.2, поскольку они имеют уязвимость безопасности. Дополнительная информация здесь.
Если по какой-то причине вам необходимо закодировать токен другим способом, вы можете внедрить любую реализацию NamshiJOSEBase64Encoder
в экземпляр JWS
. Аналогично, JWS::load()
принимает такую реализацию в качестве второго аргумента.
Библиотека предоставляет базовый класс JWT, который реализует то, что необходимо только для веб-токенов JSON. Затем класс JWS расширяет класс JWT и добавляет реализацию для подписи и проверки с использованием веб-подписей JSON. Класс SimpleJWS расширяет базовый класс JWS и добавляет проверку TTL и включение автоматических утверждений.
Появилась возможность указать механизм шифрования. Добавлена поддержка PHPSecLib в существующую реализацию OpenSSL.
Добавлена возможность устанавливать собственные свойства в шапке. Перемещено автоматическое включение определенных утверждений в класс SimpleJWS из базового класса JWS.
Перемещены phpseclib и расширение openssl в качестве предлагаемых зависимостей.
Для этой библиотеки тесты написаны с использованием PHPUnit. После установки композитора вы можете выполнить следующую команду для запуска тестов:
./vendor/bin/phpunit
Эта библиотека была вдохновлена первоначальной работой, проделанной @ritou.