wassa / apikey-authenticator-bundle
Wassa ApiKeyAuthenticatorBundle
Requires
- php: ^5.5|^7.0
- symfony/framework-bundle: ~2.8|~3.0|~4.0
- symfony/security: ~4.0
This package is auto-updated.
Last update: 2024-09-15 03:19:00 UTC
README
Symfony网站有一个关于如何创建API令牌认证系统的优秀教程。它非常清晰易懂,很容易复现。然而,从我们的角度来看,它存在2个主要问题
- 如果你有很多项目(比如Wassa的情况),为每个项目复现它可能会相当耗时
- 教程更针对我们所说的“多用户”环境,其中单个API与单个用户相关联。
这个组件旨在解决这两个问题。
要求
- Symfony 2.8
安装
第一次运行
composer require wassa/apikey-authenticator-bundle
然后更新AppKernel.php
...
new Wassa\ApiKeyAuthenticatorBundle\WassaApiKeyAuthenticatorBundle(),
...
API密钥必须存储在var/private/api.key
中。你可以自己创建文件或使用内置命令创建密钥
mkdir -p var/private
php bin/console apikey-authenticator:create-key [apiKey] [-s size]
如果你没有提供API密钥,命令将使用默认生成器(参见“创建自己的生成器”)来创建随机密钥。默认随机密钥长度为32个字符,但可以进行配置(参见“配置”)或使用-s
开关手动设置。
请记住,设置正确的权限,以确保只有Web服务器可以读取密钥文件。
配置
组件无需任何特殊配置即可工作。如有必要,请将以下块添加和编辑到config.yml
wassa_api_key_authenticator:
role: 'ROLE_API' # Role that will be assigned to authenticated requests
name: 'x-api-key' # Name of the "field" that must contain the API key
location: 'all' # Where to look for the API key in the request
generator: 'wassa_api_key_authenticator.random_generator' # Generator to use to generate the API key
key_size: 32 # Size of the generated API key
name
参数指定请求中包含API密钥的“字段”名称。
location
参数指定在请求中查找API密钥的“字段”。
headers
:在HTTP头中查找query
:在查询参数中查找body
:在POST数据参数中查找all
:查找上述所有内容并返回第一个找到的(按上述顺序)
location
可以是不同值的组合,例如'headers&query'
以在头和查询中查找但不查找正文。
然后编辑security.yml
...
providers:
api_key_provider:
id: wassa_api_key_authenticator.user_provider
...
firewalls:
...
main:
...
guard:
authenticators:
- wassa_api_key_authenticator.authenticator
...
access_control:
...
- { path: ^/api, roles: ROLE_API }
...
确保access_control
配置与config.yml
中相同的角色。
创建自己的API密钥生成器
如果你需要的API密钥比一系列X个字符更复杂,你可以创建自己的生成器。
为此,只需创建一个实现ApiKeyGeneratorInterface
的服务,并在generate()
方法中编写自己的逻辑。
然后配置组件在config.yml
wassa_api_key_authenticator:
...
generator: 'app.my_generator'
Composer post-install脚本
您可以通过在composer.json
中包含内置的post-install脚本来自动创建API密钥
"scripts": {
"post-install-cmd": [
...
"Wassa\\ApiKeyAuthenticatorBundle\\Composer\\ScriptHandler::generateApiKey"
]
},
"extra": {
...
"apikey-size": 128
}
apikey-size
是可选的,如果您不指定它,密钥将使用配置的密钥大小创建。
此外,如果已经存在API密钥,它将不会被覆盖。
管理多个API密钥
目前我们的组件只处理一个API密钥,这就是它最初被制作的原因,所以没问题。如果你想处理多个密钥,那么你可以按照以下简单步骤进行
- 创建一个实现我们的
ApiKeyUserInterface
的自己的User类并提供getApiKey()
的实现 - 创建一个自己的UserProvider类或使用一个适合你的类(如FOSUserBundle)。
本部分 的教程可以帮助您完成此操作。