my_project/
├── bin/
├── config/
│ ├── packages/
│ └── lexik_jwt_authentication.yaml
│ └── gesdinet_jwt_refresh_token.yaml
具体内容:
lexik_jwt_authentication:
secret_key: '%kernel.project_dir%/config/jwt/private.pem'
public_key: '%kernel.project_dir%/config/jwt/public.pem'
pass_phrase: '%env(JWT_PASSPHRASE)%'
token_ttl: 3600
具体内容:
gesdinet_jwt_refresh_token:
refresh_token_class: App\Entity\RefreshToken #指定用哪个实体来保存 refresh token(自定义的)
ttl: 86400 #默认这个refresh_token有效期是一个月,这里配置为1天
ttl_update: true #每次使用 refresh token 成功刷新后,自动延长它的过期时间, 顺便说一下 ttl_update: true 的效果 当客户端用 refresh token 请求 /api/token/refresh 时,如果刷新成功,会自动把这个 refresh token 的 valid 时间 续期,也就是重新+1小时(或+1天,看你的 ttl 配置)。如果 ttl_update: false,那么 refresh token 用一次就快过期了(不续命)。
在~/config/routes.yaml下添加如下配置:
api_login_check:
path: /api/login_check
api_refresh_token:
path: /api/token/refresh
在~/config/packages/security.yaml下添加如下配置:
providers:
app_user_provider:
entity:
class: App\Entity\User
# 这里定义了 property: email, 那么整个登陆过程就不会调用 User Entity 下的 getUserIdentifier, 实际上是 UserRepository 下的 loadUserByIdentifier, 而是直接使用 email 作为用户登陆的唯一标识
# 根据实际开发需求,需要在 loadUserByIdentifier 下,自定义用户登录库的验证逻辑(拦截验证)
# 这个配置告诉 Symfony 应该用哪个字段来查找用户, 两种方式 1.通过直接定义字段的凡是,比如这里的 email,2. 通过 loadUserByIdentifier
# property: email
firewalls:
login:
pattern: ^/api/(login|token/refresh)
stateless: true
json_login:
check_path: /api/login_check
success_handler: lexik_jwt_authentication.handler.authentication_success
failure_handler: lexik_jwt_authentication.handler.authentication_failure
refresh_jwt:
check_path: /api/token/refresh
provider: app_user_provider
api:
pattern: ^/api
stateless: true
jwt: ~
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
# Easy way to control access for large sections of your site
# Note: Only the *first* access control that matches will be used
access_control:
- { path: ^/api/(login|token/refresh), roles: PUBLIC_ACCESS }
- { path: ^/api, roles: IS_AUTHENTICATED_FULLY }