nviimedia/pimcore-jwt-auth

模块允许使用 JWT 与 Pimcore 用户对象

安装: 6

依赖者: 0

建议者: 0

安全性: 0

星标: 0

关注者: 0

分支: 3

类型:pimcore-bundle

v2.0.0 2022-04-20 19:20 UTC

This package is auto-updated.

Last update: 2024-09-21 01:42:31 UTC


README

此包为 Pimcore API 提供了 JWT(Json Web Token)身份验证。它基于 lexik/jwt-authentication-bundle

它与 PHP 7 和 Pimcore 6 兼容并经过测试。

目录

先决条件

此模块需要 Pimcore 6 和 openssl 扩展。

安装

在 Pimcore 中创建 User 类

Screenshot

app/AppKernel.php 中注册依赖关系

  public function registerBundlesToCollection(BundleCollection $collection)
    {
        // ...
        if (class_exists('Lexik\Bundle\JWTAuthenticationBundle\LexikJWTAuthenticationBundle')) {
            $collection->addBundle(new Lexik\Bundle\JWTAuthenticationBundle\LexikJWTAuthenticationBundle());
        }
        if (class_exists('Nelmio\CorsBundle\NelmioCorsBundle')) {
            $collection->addBundle(new Nelmio\CorsBundle\NelmioCorsBundle());
        }
    }

生成 SSH 密钥

$ mkdir app/config/jwt
$ openssl genrsa -out app/config/jwt/private.pem -aes256 4096
$ openssl rsa -pubout -in app/config/jwt/private.pem -out config/jwt/public.pem

如果第一个 openssl 命令要求您输入密码,请使用以下命令获取解密后的私钥

$ openssl rsa -in app/config/jwt/private.pem -out config/jwt/private2.pem
$ mv app/config/jwt/private.pem config/jwt/private.pem-back
$ mv app/config/jwt/private2.pem config/jwt/private.pem

配置

在您的 app/config/lexik_jwt_authentication.yaml 中配置 SSH 密钥路径

lexik_jwt_authentication:
    secret_key:       '%kernel.project_dir%/app/config/jwt/private.pem' # required for token creation
    public_key:       '%kernel.project_dir%/app/config/jwt/public.pem'  # required for token verification
    pass_phrase:      'your_secret_passphrase' # required for token creation, usage of an environment variable is recommended
    token_ttl:        3600

app/config/nelmio_cors.yml 中配置 CORS 配置

nelmio_cors:
  defaults:
    allow_credentials: false
    allow_origin: []
    allow_headers: []
    allow_methods: []
    expose_headers: []
    max_age: 0
    hosts: []
    origin_regex: false
    forced_allow_origin_value: ~
  paths:
    '^/api/':
      allow_origin: ['*']
      allow_headers: ['*']
      allow_methods: ['POST', 'PUT', 'GET', 'DELETE']
      max_age: 3600

配置您的 app/config/security.yml

security:
    # ...
    
   providers:
       pimcore_user_provider:
         id: login_bundle.security.user_provider
     firewalls:
       login:
         pattern: ^/api/login
         stateless: true
         anonymous: true
         provider: pimcore_user_provider
         json_login:
           check_path:               /api/login
           success_handler:          lexik_jwt_authentication.handler.authentication_success
           failure_handler:          lexik_jwt_authentication.handler.authentication_failure
   
       api:
          pattern:   ^/api
          stateless: true
          provider: pimcore_user_provider
          guard:
            authenticators:
              - lexik_jwt_authentication.jwt_token_authenticator
   
     access_control:
       - { path: ^/api/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
       - { path: ^/api,       roles: IS_AUTHENTICATED_FULLY }

配置您的 app/config/config.yml

imports:
    # ...
    - { resource: lexik_jwt_authentication.yml }
    - { resource: nelmio_cors.yml }

配置您的 config/routing.yml

api_login_check:
    path: /api/login

使用方法

第一步是使用其凭据对用户进行身份验证。在匿名可访问的防火墙上进行经典的 form_login 即可。

只需设置提供的 lexik_jwt_authentication.handler.authentication_success 服务作为成功处理器来生成令牌并将其作为 JSON 响应体的一部分发送。

存储它(客户端),JWT 在其 ttl 过期之前可重复使用(默认为 3600 秒)。在 Pimcore 面板中创建一个 User 类的对象并填写其凭据。

注意:您可以使用类似于以下简单的 curl 命令来测试获取令牌

curl -X POST -H "Content-Type: application/json" https:///api/login -d '{"username":"admin","password":"test"}'

如果它正常工作,您将收到类似以下内容

{
   "token" : "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXUyJ9.eyJleHAiOjE0MzQ3Mjc1MzYsInVzZXJuYW1lIjoia29ybGVvbiIsImlhdCI6IjE0MzQ2NDExMzYifQ.nh0L_wuJy6ZKIQWh6OrW5hdLkviTs1_bau2GqYdDCB0Yqy_RplkFghsuqMpsFls8zKEErdX5TYCOR7muX0aQvQxGQ4mpBkvMDhJ4-pE4ct2obeMTr_s4X8nC00rBYPofrOONUOR4utbzvbd4d2xT_tj4TdR_0tsr91Y7VskCRFnoXAnNT-qQb7ci7HIBTbutb9zVStOFejrb4aLbr7Fl4byeIEYgp2Gd7gY"
}

使用令牌

简单地将 JWT 传递到每个受保护的防火墙请求中,无论是作为授权头还是作为查询参数。

默认情况下,仅启用授权头模式: Authorization: Bearer {token}

关于令牌过期

令牌过期后的每个请求都将导致 401 响应。重新执行身份验证过程以获取新的令牌。

也许您想使用 刷新令牌 来更新您的 JWT。在这种情况下,您可以检查 JWTRefreshTokenBundle

更多详细信息

有关更多详细信息,请参阅 LexikJWTAuthenticationBundle

标准与代码质量

此模块遵守 PSR-2 代码质量规则和我们的 PHPCS 和 PHPMD 规则集。

关于作者

Divante-logo

我们是一家来自欧洲的软件公司,自 2008 年成立以来,拥有约 150 名员工。我们的核心竞争力围绕着 Magento、Pimcore 和定制软件项目(我们喜欢 Symfony3、Node.js、Angular、React、Vue.js)。我们专注于复杂的集成项目,试图将硬核 IT 与优秀的产品设计和 UX 连接起来。

我们为 INTERSPORT、ING、Odlo、Onderdelenwinkel 和 CDP 等客户工作,CDP 是制作《巫师》游戏的公司。我们开发了两个项目: Open Loyalty - 一个开源的忠诚度计划,以及 Vue.js Storefront

我们是华沙证券交易所上市公司OEX集团的一部分。我们的年收入每年至少增长约30%。

访问我们的网站Divante.co获取更多信息。