remp / crm-wordpress-module

2.0.0 2022-08-25 08:28 UTC

README

Translation status @ Weblate

用户身份验证

CRM 支持对配置的 WordPress 实例进行用户身份验证。要启用此功能,

安装

  1. 安装我们的 WordPress 插件,该插件公开 API 以验证凭据。

  2. 在 CRM 管理设置中配置 WordPress CMS URL 和 WordPress 认证令牌(/admin/config-admin - 集成)

  3. 在您的模块中注册认证器

class DemoModule extends \Crm\ApplicationModule\CrmModule
{
    // ...
    public function registerAuthenticators(\Crm\ApplicationModule\Authenticator\AuthenticatorManagerInterface $authenticatorManager)
    {
        $authenticatorManager->registerAuthenticator(
            $this->getInstance(\Crm\WordpressModule\Authenticator\WordpressAuthenticator::class),
            100
        );
    }
// ...
}

启用后,每次用户尝试登录时,将发生以下操作

  • 首先 CRM 将使用默认的认证器集,优先级更高。其中之一是尝试登录本地 users 表。
  • 如果所有优先级更高的认证器都失败,CRM 将尝试使用 WordpressAuthenticator 并验证您配置的 WordPress 实例的凭据。
  • 如果成功,CRM 将在本地创建用户并设置与用户刚刚在 WordPress 中验证相同的密码,因此 CRM 能够在将来验证密码。

我们建议只在过渡期(几个月)内启用此认证器。禁用时,在过渡期内未进行身份验证的用户将不得不创建账户/重置密码(具体取决于您是否在迁移用户之前迁移了用户)。

配置

WordpressAuthenticator 在 CRM 中创建新用户时,它会设置在 WordPress 中验证的密码,以便人们可以使用相同的密码登录 CRM。

然而,如果账户已在 CRM 中存在并且密码不同,WordpressAuthenticator 默认情况下不会更改用户的密码。如果您希望为现有的 CRM 账户设置已验证的 WordPress 密码,请将以下代码片段添加到您的 app/config/config.neon 中。

# enable WordressModule extension
extensions:
    wordpress: Crm\WordpressModule\DI\WordpressModuleExtension

wordpress:
    # configure authenticator
    authenticator:
        passwordReset: true

安全性和用户迁移

默认情况下,同时拥有两个用户基础并不是一个好主意,我们建议 CRM 成为您的首选真实来源。这样您可以防止账户劫持和其他与多个身份验证机制相关的漏洞。我们已经想到了两个可以帮助您迁移的场景。

先迁移,后验证

为了防止任何类型的歧义,WordPress 和 CRM 用户都应相互连接。实现这一点的最佳方法是首先迁移/同步 WP 用户到 CRM - 请参阅下面的 同步用户 API 端点

如果您不期望用户来自任何其他来源,您可以通过 users.ext_id 列创建硬链接。 WordpressModule 可以为您处理此操作,只需在您的 app/config/config.neon 中配置以下标志。否则,wordpress_users 表和 users 表之间将只有软链接。

# enable WordressModule extension
extensions:
    wordpress: Crm\WordpressModule\DI\WordpressModuleExtension

wordpress:
    # enable ext ID referencing
    extIdReferencing: true

API 文档

所有示例都使用 http://crm.press 作为基础域名。请在执行示例之前将主机更改为您使用的域名。

所有示例都使用 XXX 作为授权令牌的默认值,请用实际令牌替换。

  • API令牌。用于服务器之间通信的标准API密钥。它代表整个调用应用程序。可以在CRM管理员界面中生成(/api/api-tokens-admin/),并且每个API密钥都必须在白名单中才能访问特定的API端点。默认情况下,API密钥无法访问任何端点。

API响应可以包含以下HTTP状态码

如果可能,响应将包含带有解释错误信息的application/json编码负载。

GET /api/v1/wordpress/sync-user

API调用根据从WordPress提供的信息在CRM中创建/更新用户。以下为处理场景

  • 如果用户在CRM中不存在,则创建并链接到WordPress用户。
  • 如果用户已存在于CRM中,并且提供的WordPress ID与CRM中链接的ID匹配,则更新用户。
  • 如果用户已存在于CRM中,但提供的WordPress ID不匹配或未在CRM用户中设置,则API返回HTTP 409冲突。
头部信息
负载
{
    "wordpress_id": 123, // required; ID of user in Wordpress.
    "email": "admin@example.com", // required; Email of user in Wordpress.
    "registered_at": "2020-03-13T14:02:44+00:00", // required; RFC3339-formatted time of user registration in Wordpress.
    "user_login": "admin", // required; Login of user in Wordpress .
    "user_nicename": "admin", // optional; Nicename of user in Wordpress.
    "user_url": "http://www.example.com", // optional; User's URL in Wordpress .
    "display_name": "Example Admin", // optional; Display name of user in Wordpress.
    "first_name": "Example", // optional; First name of user in Wordpress
    "last_name": "Admin" // optional; Last name of user in Wordpress
}
示例
curl -request POST 'http://crm.press/api/v1/wordpress/sync-user' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer XXX' \
--data-raw '{
    "wordpress_id": 145,
    "email": "admin@example.fu",
    "registered_at": "2020-03-13T14:02:44+00:00",
    "user_login": "admin",
    "user_nicename": "admin",
    "user_url": "http://www.example.com",
    "display_name": "Example Admin",
    "first_name": "Example", 
    "last_name": "vcvc"
}'

响应

{
    "user_id": 374513,
    "wordpress_id": 145,
    "email": "admin@example.fu",
    "login": "admin",
    "registered_at": "2020-03-13T14:02:44+01:00",
    "nicename": "admin",
    "url": "http://www.example.com",
    "display_name": "Example Admin",
    "first_name": "Example",
    "last_name": "vcvc"
}