在 API Platform 中,可以使用外部 JWT 提供者,如 Auth0、Firebase、Okta 等。这可以帮助开发者将认证和授权逻辑与应用程序分离,同时也可以让应用程序更安全和可扩展。
下面是一个示例,以使用 Auth0 作为 JWT 提供者:
在 Auth0 中创建一个应用程序,并获取客户端 ID 和客户端秘密。
在 API Platform 中,安装 JWT 扩展:
composer require lexik/jwt-authentication-bundle "^2.7"
# app/config/packages/lexik_jwt_authentication.yaml
lexik_jwt_authentication:
secret_key: '%kernel.project_dir%/config/jwt/private.pem' # path to private key
public_key: '%kernel.project_dir%/config/jwt/public.pem' # path to public key
pass_phrase: 'your_pass_phrase'
token_ttl: 3600
# Add auth0 public key
jwt_encoder:
signature_algorithm: RS256
key_path: '%kernel.project_dir%/config/jwt/public_auth0.pem'
# If the key has a pass phrase, add the `pass_phrase` parameter:
# pass_phrase: 'your_pass_phrase'
function (user, context, callback) {
const namespace = 'https://api-platform.com/';
const assignedRoles = (context.authorization || {}).roles;
const scopes = (context.authorization || {}).scopes;
context.idToken[namespace + 'roles'] = assignedRoles;
context.accessToken[namespace + 'roles'] = assignedRoles;
context.accessToken[namespace + 'scopes'] = scopes;
callback(null, user, context);
}
# ...
security:
encoders:
App\Entity\User:
algorithm: bcrypt
# Add JWT auth guard
firewalls:
dev:
...
main:
anonymous: true
guard:
authenticators:
- lexik_jwt_authentication.jwt_token_authenticator
provider: app_user_provider
pattern: ^/
stateless: true
# Add access control with required roles
access_control:
- { path: ^/admin, roles: ROLE_ADMIN }
- { path: