divante-ltd/pimcore-jwt-auth

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

安装: 117

依赖项: 0

建议者: 0

安全: 0

星标: 0

关注者: 7

分支: 3

开放问题: 3

类型:pimcore-bundle

v1.0.0 2020-09-01 08:41 UTC

This package is auto-updated.

Last update: 2024-08-29 05:19:11 UTC


README

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

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

目录

先决条件

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

安装

在 Pimcore 中创建用户类

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" http://localhost/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 Group 的一部分,该集团在华沙证券交易所上市。我们的年收入以至少每年 30% 的速度增长。

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