JSON Web Token (JWT), открытый стандарт на основе JSON (RFC 7519), реализованный для передачи объявлений между средами сетевых приложений. Токен предназначен для компактного и безопасного, особенно подходящего для сценариев отдельных подписей (SSO) для распределенных участков.
Операторы JWT, как правило, используются для передачи аутентифицированной информации пользователя между поставщиком идентификаторов и поставщиком услуг для облегчения получения ресурсов с сервера ресурсов. Некоторая дополнительная информация об декларации, необходимая для другой бизнес -логики, также может быть добавлена. Токен также может быть использован для аутентификации или шифрования.

HMAC-SHA256(SecretKey, Base64UrlEncode(JWT-Header)+'.'+Base64UrlEncode(JWT-Payload))base64(header).base64(payload).signature как токен JWT, чтобы вернуться к клиенту.composer require tinywan/jwt use Tinywan Jwt JwtToken ;
$ user = [
' id ' => 2022 ,
' name ' => ' Tinywan ' ,
' email ' => ' [email protected] '
];
$ token = JwtToken:: generateToken ( $ user );
var_dump ( json_encode ( $ token ));Вывод (формат JSON)
{
"token_type" : " Bearer " ,
"expires_in" : 36000 ,
"access_token" : " eyJ0eXAiOiJAUR-Gqtnk9LUPO8IDrLK7tjCwQZ7CI... " ,
"refresh_token" : " eyJ0eXAiOiJIEGkKprvcccccQvsTJaOyNy8yweZc... "
}Параметры ответа
| параметр | тип | описывать | Пример значений |
|---|---|---|---|
| token_type | нить | Тип токена | Носитель |
| истекает_ин | инт | Время достоверности ваучера, блок: секунды | 36000 |
| access_token | нить | Доступ к учетным данным | Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| represh_token | нить | Обновление учетных данных (срок использования учетных данных доступа) | Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
1. Получите текущий id
$ id = Tinywan Jwt JwtToken:: getCurrentId ();2. Получите все поля
$ email = Tinywan Jwt JwtToken:: getExtend ();3. Получите пользовательские поля
$ email = Tinywan Jwt JwtToken:: getExtendVal ( ' email ' );4. Обновление токена (получите токен доступа, освежающий токен)
$ refreshToken = Tinywan Jwt JwtToken:: refreshToken ();5. Оставшееся время периода достоверности токена
$ exp = Tinywan Jwt JwtToken:: getTokenExp (); 6. Вход в одиночное устройство. По умолчанию выключено. Пожалуйста, измените конфигурацию файла config/plugin/tinywan/jwt
' is_single_device ' => true,Вход для одного устройства поддерживает определение поля
clientи настройку единого входа клиента (по умолчаниюWEB, то есть веб-страница), например:MOBILE,APP,WEB,ADMIN,API,OTHERи т. Д.
$ user = [
' id ' => 2022 ,
' name ' => ' Tinywan ' ,
' client ' => ' MOBILE ' ,
];
$ token = Tinywan Jwt JwtToken:: generateToken ( $ user );
var_dump ( json_encode ( $ token ));7. Получить текущую информацию пользователя (модель)
$ user = Tinywan Jwt JwtToken:: getUser (); Проект конфигурации 'user_model' - это анонимная функция, которая по умолчанию возвращает пустой массив. Вы можете настроить свою собственную модель возврата в соответствии с вашим проектом ORM
Подумайте о конфигурации
' user_model ' => function ( $ uid ) {
// 返回一个数组
return think facade Db:: table ( ' resty_user ' )
-> field ( ' id,username,create_time ' )
-> where ( ' id ' , $ uid )
-> find ();
}Конфигурация Laravelorm
' user_model ' => function ( $ uid ) {
// 返回一个对象
return support Db:: table ( ' resty_user ' )
-> where ( ' id ' , $ uid )
-> select ( ' id ' , ' email ' , ' mobile ' , ' create_time ' )
-> first ();
}8. Очистка токена
$ res = Tinywan Jwt JwtToken:: clear ();Только если элемент конфигурации
is_single_devicetrue, вступит в силу. Дополнительные параметры:MOBILE,APP,WEB,ADMIN,API,OTHERи т. Д.
9. Пользовательский client терминала
// 生成WEB令牌
$ user = [
' id ' => 2022 ,
' name ' => ' Tinywan ' ,
' client ' => JwtToken:: TOKEN_CLIENT_WEB
];
$ token = JwtToken:: generateToken ( $ user );
// 生成移动端令牌
$ user = [
' id ' => 2022 ,
' name ' => ' Tinywan ' ,
' client ' => JwtToken:: TOKEN_CLIENT_MOBILE
];
$ token = JwtToken:: generateToken ( $ user ); По умолчанию WEB -
10. Настройте время истечения срока действия токена доступа и обновить токен
$ extend = [
' id ' => 2024 ,
' access_exp ' => 7200 , // 2 小时
];
$ token = Tinywan Jwt JwtToken:: generateToken ( $ extend );11. Код ошибки истечения срока действия токена
401011401012401013401014401015401021401022401023401024401025 Наиболее распространенные алгоритмы подписи JWT (JWA): HS256(HMAC-SHA256) , RS256(RSA-SHA256) и ES256(ECDSA-SHA256)
+--------------+-------------------------------+--------------------+
| " alg " Param | Digital Signature or MAC | Implementation |
| Value | Algorithm | Requirements |
+--------------+-------------------------------+--------------------+
| HS256 | HMAC using SHA - 256 | Required |
| HS384 | HMAC using SHA - 384 | Optional |
| HS512 | HMAC using SHA - 512 | Optional |
| RS256 | RSASSA - PKCS1 -v1_5 using | Recommended |
| | SHA - 256 | |
| RS384 | RSASSA - PKCS1 -v1_5 using | Optional |
| | SHA - 384 | |
| RS512 | RSASSA - PKCS1 -v1_5 using | Optional |
| | SHA - 512 | |
| ES256 | ECDSA using P- 256 and SHA - 256 | Recommended+ |
| ES384 | ECDSA using P- 384 and SHA - 384 | Optional |
| ES512 | ECDSA using P- 521 and SHA - 512 | Optional |
| PS256 | RSASSA - PSS using SHA - 256 and | Optional |
| | MGF1 with SHA - 256 | |
| PS384 | RSASSA - PSS using SHA - 384 and | Optional |
| | MGF1 with SHA - 384 | |
| PS512 | RSASSA - PSS using SHA - 512 and | Optional |
| | MGF1 with SHA - 512 | |
| none | No digital signature or MAC | Optional |
| | performed | |
+--------------+-------------------------------+--------------------+
The use of " + " in the Implementation Requirements column indicates
that the requirement strength is likely to be increased in a future
version of the specification.Вы можете видеть, что рекомендуется только RS256 и ES256.
В установке плагина используется алгоритм симметричного шифрования
HS256по умолчанию.
HS256 использует тот же 「secret_key」 для подписи и проверки. Как только утечка secret_key , безопасности вообще нет. Следовательно, HS256 подходит только для централизованной аутентификации, и как доверенные стороны должны выполняться как подписи, так и проверку.
Серия RS256 подписана с использованием частного ключа RSA и проверяется с использованием открытого ключа RSA.
Даже если публичный ключ протекает, он не будет иметь никакого эффекта. Просто убедитесь, что закрытый ключ безопасен. RS256 может делегировать проверку другим приложениям, просто дайте им открытый ключ.
Ниже приведены команды генерации алгоритмов серии RS только для справки.
ssh-keygen -t rsa -b 4096 -E SHA512 -m PEM -P "" -f RS512 .key
openssl rsa -in RS512 .key -pubout -outform PEM -out RS512 .key.pubssh-keygen -t rsa -b 4096 -E SHA354 -m PEM -P "" -f RS384 .key
openssl rsa -in RS384 .key -pubout -outform PEM -out RS384 .key.pubssh-keygen -t rsa -b 4096 -E SHA256 -m PEM -P "" -f RS256 .key
openssl rsa -in RS256 .key -pubout -outform PEM -out RS256 .key.pubСтуденты, которые не понимают, могут узнать о видео, и будут подробные инструкции.
https://www.w3cschool.cn/fastapi/fastapi-cmia3lcw.html
Есть много способов решения таких вопросов, как безопасность, аутентификация идентификации и разрешение. И это часто сложная и «сложная» тема. Во многих структурах и системах, работа с аутентификацией безопасности и аутентификации идентификации требует только больших усилий и кода (во многих случаях это может составлять 50% или более всего написанного кода).
JWT помогает вам легко и быстро справляться с безопасностью стандартным способом, не изучая и не изучая все спецификации безопасности.
Предположим, у вас есть бэкэнд API в домене. И у вас есть фронт в другом пути (или мобильном приложении) в другом домене или в одном и том же домене. И вы хотите, чтобы у подлинности есть способ получить передний конец с использованием имени пользователя и пароля. Мы можем использовать OAuth2, чтобы построить его через JWT.
username и password на передней части и нажимает Enter.username и password в наш API на определенном URL (чтобы объявить tokenUrl="token" ).Authorization заголовка с Bearer значения плюс токен. Если токен содержит foobar , содержание заголовка Authorization будет: Bearer foobar .注意:中间是有个空格.