JSON Web Token (JWT), um padrão aberto baseado em JSON (RFC 7519) implementado para passar declarações entre ambientes de aplicativos de rede. O token foi projetado para ser compacto e seguro, especialmente adequado para cenários de assinatura única (SSO) para sites distribuídos.
As instruções JWT são geralmente usadas para aprovar informações de identidade do usuário autenticadas entre o provedor de identidade e o provedor de serviços para facilitar a aquisição de recursos do servidor de recursos. Algumas informações adicionais de declaração necessárias para outra lógica de negócios também podem ser adicionadas. O token também pode ser usado para autenticação ou criptografado.

HMAC-SHA256(SecretKey, Base64UrlEncode(JWT-Header)+'.'+Base64UrlEncode(JWT-Payload))base64(header).base64(payload).signature como token JWT para retornar ao 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 ));Saída (formato JSON)
{
"token_type" : " Bearer " ,
"expires_in" : 36000 ,
"access_token" : " eyJ0eXAiOiJAUR-Gqtnk9LUPO8IDrLK7tjCwQZ7CI... " ,
"refresh_token" : " eyJ0eXAiOiJIEGkKprvcccccQvsTJaOyNy8yweZc... "
}Parâmetros de resposta
| parâmetro | tipo | descrever | Valores de exemplo |
|---|---|---|---|
| token_type | corda | Tipo de token | Portador |
| expire_in | int | O tempo de validade do voucher, unidade: segundos | 36000 |
| Access_token | corda | Credenciais de acesso | Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. |
| refresh_token | corda | Atualizar credenciais (uso de credenciais de acesso expiradas) | Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. |
1. Obtenha o id atual
$ id = Tinywan Jwt JwtToken:: getCurrentId ();2. Obtenha todos os campos
$ email = Tinywan Jwt JwtToken:: getExtend ();3. Obtenha campos personalizados
$ email = Tinywan Jwt JwtToken:: getExtendVal ( ' email ' );4. Atualizar o token (obtenha o token de acesso por token refrescante)
$ refreshToken = Tinywan Jwt JwtToken:: refreshToken ();5. O tempo restante do período de validade do token
$ exp = Tinywan Jwt JwtToken:: getTokenExp (); 6. Login de dispositivo único. O padrão está desligado. Modifique a configuração config/plugin/tinywan/jwt
' is_single_device ' => true,O login de dispositivo único suporta a definição de campos
cliente a personalização do cliente único (o padrão éWEB, ou seja, página da web), 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. Obtenha informações atuais do usuário (modelo)
$ user = Tinywan Jwt JwtToken:: getUser (); O projeto de configuração 'user_model' é uma função anônima, que retorna uma matriz vazia por padrão. Você pode personalizar seu próprio modelo de retorno de acordo com o seu projeto ORM
Configuração do Thinkorm
' user_model ' => function ( $ uid ) {
// 返回一个数组
return think facade Db:: table ( ' resty_user ' )
-> field ( ' id,username,create_time ' )
-> where ( ' id ' , $ uid )
-> find ();
}Configuração do Laravelorm
' user_model ' => function ( $ uid ) {
// 返回一个对象
return support Db:: table ( ' resty_user ' )
-> where ( ' id ' , $ uid )
-> select ( ' id ' , ' email ' , ' mobile ' , ' create_time ' )
-> first ();
}8. Limpeza de tokens
$ res = Tinywan Jwt JwtToken:: clear ();Somente se o item de configuração
is_single_devicefortrue, ele entrará em vigor. Parâmetros opcionais:MOBILE,APP,WEB,ADMIN,API,OTHER, etc.
9. client Custom Terminal
// 生成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 ); O padrão é WEB
10. Personalize o tempo de expiração do token de acesso e atualize o token
$ extend = [
' id ' => 2024 ,
' access_exp ' => 7200 , // 2 小时
];
$ token = Tinywan Jwt JwtToken:: generateToken ( $ extend );11. Código de erro de expiração do token
401011401012401013401014401015401021401022401023401024401025 Algoritmos de assinatura mais comuns do JWT (JWA): HS256(HMAC-SHA256) , RS256(RSA-SHA256) e 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.Você pode ver que apenas Rs256 e ES256 são marcados recomendados.
A instalação do plug-in usa
HS256por padrão.
O HS256 usa o mesmo 「secret_key」 para assinatura e verificação. Uma vez que secret_key vazar, não há segurança. Portanto, o HS256 é adequado apenas para autenticação centralizada, e as assinaturas e a verificação devem ser realizadas por partes confiáveis.
A série RS256 é assinada usando a chave privada da RSA e verificada usando a chave pública da RSA.
Mesmo que a chave pública vaze, ela não terá efeito. Apenas verifique se a chave privada está segura. O RS256 pode delegar a verificação a outros aplicativos, basta dar a eles a chave pública.
A seguir, os seguintes comandos de geração de algoritmo da série RS apenas para referência
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.pubOs alunos que não entendem podem aprender sobre o vídeo e haverá instruções detalhadas.
https://www.w3cschool.cn/fastapi/fastapi-cmia3lcw.html
Existem muitas maneiras de lidar com questões como segurança, autenticação de identidade e autorização. E este geralmente é um tópico complexo e "difícil". Em muitas estruturas e sistemas, lidar com a autenticação de segurança e identidade exige apenas muito esforço e código (em muitos casos, pode representar 50% ou mais de todo o código escrito).
O JWT ajuda a lidar com a segurança de maneira fácil e rápida de maneira padrão, sem pesquisar e aprender todas as especificações de segurança.
Suponha que você tenha uma API de back -end em um domínio. E você tem um front -end em um caminho diferente (ou aplicativo móvel) em outro domínio ou no mesmo domínio. E você quer que haja uma maneira de obter o front-end para autenticar com o back-end usando o nome de usuário e a senha. Podemos usar OAuth2 para construí -lo através do JWT.
username e password no front -end e clique em Enter.username e password para nossa API em um URL específico (para declarar tokenUrl="token" ).Authorization um cabeçalho com o Bearer de valor mais o token. Se o token contiver foobar , o conteúdo do cabeçalho Authorization será: Bearer foobar .注意:中间是有个空格.