wassa/apikey-authenticator-bundle

Wassa ApiKeyAuthenticatorBundle

1.0.3 2020-01-14 17:29 UTC

This package is auto-updated.

Last update: 2024-09-15 03:19:00 UTC


README

Symfony网站有一个关于如何创建API令牌认证系统的优秀教程。它非常清晰易懂,很容易复现。然而,从我们的角度来看,它存在2个主要问题

  1. 如果你有很多项目(比如Wassa的情况),为每个项目复现它可能会相当耗时
  2. 教程更针对我们所说的“多用户”环境,其中单个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)。

本部分 的教程可以帮助您完成此操作。