JSON Web Token (JWT), un estándar abierto basado en JSON (RFC 7519) implementado para aprobar declaraciones entre entornos de aplicación de red. El token está diseñado para ser compacto y seguro, especialmente adecuado para escenarios de inicio de sesión único (SSO) para sitios distribuidos.
Las declaraciones JWT generalmente se utilizan para aprobar información de identidad de usuario autenticada entre el proveedor de identidad y el proveedor de servicios para facilitar la adquisición de recursos del servidor de recursos. También se puede agregar información de declaración adicional necesaria para otra lógica comercial. El token también se puede usar para autenticación o encriptado.

HMAC-SHA256(SecretKey, Base64UrlEncode(JWT-Header)+'.'+Base64UrlEncode(JWT-Payload))base64(header).base64(payload).signature como jwt token para regresar al cliente.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 ));Salida (formato JSON)
{
"token_type" : " Bearer " ,
"expires_in" : 36000 ,
"access_token" : " eyJ0eXAiOiJAUR-Gqtnk9LUPO8IDrLK7tjCwQZ7CI... " ,
"refresh_token" : " eyJ0eXAiOiJIEGkKprvcccccQvsTJaOyNy8yweZc... "
}Parámetros de respuesta
| parámetro | tipo | describir | Valores de ejemplo |
|---|---|---|---|
| token_type | cadena | Tipo de token | Portador |
| expires_in | intencionalmente | El tiempo de validez del comprobante, Unidad: segundos | 36000 |
| Access_Token | cadena | Credenciales de acceso | XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX |
| Refresh_token | cadena | Actualizar credenciales (uso de credenciales de acceso expiradas) | XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX |
1. Obtenga la id actual
$ id = Tinywan Jwt JwtToken:: getCurrentId ();2. Obtenga todos los campos
$ email = Tinywan Jwt JwtToken:: getExtend ();3. Obtenga campos personalizados
$ email = Tinywan Jwt JwtToken:: getExtendVal ( ' email ' );4. Actualice token (obtenga token de acceso refrescante token)
$ refreshToken = Tinywan Jwt JwtToken:: refreshToken ();5. El tiempo restante del período de validez del token
$ exp = Tinywan Jwt JwtToken:: getTokenExp (); 6. Inicie de sesión de un solo dispositivo. El valor predeterminado está desactivado. Modifique el archivo de configuración config/plugin/tinywan/jwt
' is_single_device ' => true,El inicio de sesión de un solo dispositivo admite la definición de los campos
clienty la personalización del cliente del cliente (predeterminado esWEB, es decir, página web), tales como:MOBILE,APP,WEB,ADMIN,API,OTHER, etc.
$ user = [
' id ' => 2022 ,
' name ' => ' Tinywan ' ,
' client ' => ' MOBILE ' ,
];
$ token = Tinywan Jwt JwtToken:: generateToken ( $ user );
var_dump ( json_encode ( $ token ));7. Obtenga información actual del usuario (modelo)
$ user = Tinywan Jwt JwtToken:: getUser (); El proyecto de configuración 'user_model' es una función anónima, que devuelve una matriz vacía de forma predeterminada. Puede personalizar su propio modelo de devolución de acuerdo con su proyecto ORM
Configuración de Thinkorm
' user_model ' => function ( $ uid ) {
// 返回一个数组
return think facade Db:: table ( ' resty_user ' )
-> field ( ' id,username,create_time ' )
-> where ( ' id ' , $ uid )
-> find ();
}Configuración de Laravelorm
' user_model ' => function ( $ uid ) {
// 返回一个对象
return support Db:: table ( ' resty_user ' )
-> where ( ' id ' , $ uid )
-> select ( ' id ' , ' email ' , ' mobile ' , ' create_time ' )
-> first ();
}8. Limpieza de tokens
$ res = Tinywan Jwt JwtToken:: clear ();Solo si el elemento de configuración
is_single_deviceestrue, entrará en vigencia. Parámetros opcionales:MOBILE,APP,WEB,ADMIN,API,OTHER, etc.
9. client de terminal personalizado
// 生成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 ); El valor predeterminado es WEB
10. Personalice el tiempo de vencimiento de token de acceso y actualización del token
$ extend = [
' id ' => 2024 ,
' access_exp ' => 7200 , // 2 小时
];
$ token = Tinywan Jwt JwtToken:: generateToken ( $ extend );11. Código de error de vencimiento de token
401011401012401013401014401015401021401022401023401024401025 Algoritmos de firma más comunes de JWT (JWA): HS256(HMAC-SHA256) , RS256(RSA-SHA256) y 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.Puede ver que solo se recomiendan RS256 y ES256.
La instalación del complemento utiliza
HS256de forma predeterminada.
HS256 usa el mismo 「secret_key」 para la firma y la verificación. Una vez que secret_key se filtra, no hay seguridad en absoluto. Por lo tanto, HS256 solo es adecuado para la autenticación centralizada, y tanto las firmas como la verificación deben ser realizadas por partes de confianza.
La serie RS256 se firma utilizando la clave privada RSA y se verifica utilizando la clave pública RSA.
Incluso si la clave pública se filtra, no tendrá ningún efecto. Solo asegúrese de que la clave privada sea segura. RS256 puede delegar la verificación a otras aplicaciones, solo darles la clave pública.
Los siguientes son los comandos de generación de algoritmo de la serie RS solo para referencia
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.pubLos estudiantes que no entienden pueden aprender sobre el video, y habrá instrucciones detalladas.
https://www.w3cschool.cn/fastapi/fastapi-cmia3lcw.html
Hay muchas formas de lidiar con problemas como la seguridad, la autenticación de identidad y la autorización. Y este es a menudo un tema complejo y "difícil". En muchos marcos y sistemas, tratar con la autenticación de seguridad e identidad solo requiere mucho esfuerzo y código (en muchos casos, puede representar el 50% o más de todos los códigos escritos).
JWT lo ayuda a manejar la seguridad de manera fácil y rápida de una manera estándar sin investigar y aprender todas las especificaciones de seguridad.
Supongamos que tiene una API de backend en un dominio. Y tiene una frontend en una ruta diferente (o aplicación móvil) en otro dominio o en el mismo dominio. Y desea que haya una manera de obtener el front-end para autenticarse con el back-end utilizando el nombre de usuario y la contraseña. Podemos usar OAuth2 para construirlo a través de JWT.
username y password en el extremo frontal y hace clic en Ingrese.username y password a nuestra API a una URL específica (para declarar tokenUrl="token" ).Authorization un encabezado con el valor Bearer más el token. Si el token contiene foobar , el contenido del encabezado Authorization será: Bearer foobar .注意:中间是有个空格.