ellaisys/telephony-exotel

云电话库 - Exotel

dev-master / 1.0.x-dev 2022-08-08 11:17 UTC

This package is auto-updated.

Last update: 2024-09-08 18:14:11 UTC


README

基于PHP/Laravel的云电话包,提供Exotel服务

Latest Version on Packagist Release Date Total Downloads APM

本包提供了一种简单的方法,在Laravel 7.x中实现AWS Cognito认证,用于Web和API认证驱动程序。我们决定将其作为包贡献给社区,以鼓励标准化使用和用于AWS Cognito认证的RAD工具。

目前,我们在包中实现了以下功能

  • 注册和确认电子邮件
  • 登录
  • 记住我cookie

免责声明

该包目前处于开发中,尚未准备好用于生产。

安装

您可以通过composer安装此包。

composer require ellaisys/telephony-exotel

Laravel 5.4及之前版本

使用Laravel 5.5之前的版本,您需要手动注册服务提供者。

// config/app.php
'providers' => [
    ...
    Ellaisys\Exotel\Providers\ExotelServiceProvider::class,
    
];

然后,您可以发布配置和视图。

php artisan vendor:publish --provider="Ellaisys\Exotel\Providers\ExotelServiceProvider"

Cognito用户池

为了使用AWS Cognito作为认证提供者,您需要一个Cognito用户池。

如果您还没有创建,请访问您的亚马逊管理控制台并创建一个新的用户池。

接下来,生成一个App客户端。这将为您提供用于您的.env文件所需的App客户端ID和App客户端密钥。

重要:不要忘记勾选启用服务器端认证的“启用登录API”复选框。认证流程称为:ADMIN_USER_PASSWORD_AUTH(以前称为ADMIN_NO_SRP_AUTH)

您还需要一个新的IAM角色,具有以下访问权限

  • AmazonCognitoDeveloperAuthenticatedIdentities
  • AmazonCognitoPowerUser
  • AmazonESCognitoAccess

从此用户中,您可以获取AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY。

Exotel电话配置

将以下字段添加到您的.env文件中,并根据您的exotel设置设置值

# AWS configurations for cloud storage
AWS_ACCESS_KEY_ID="Axxxxxxxxxxxxxxxxxxxxxxxx6"
AWS_SECRET_ACCESS_KEY="mxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx+"

# AWS Cognito configurations
AWS_COGNITO_CLIENT_ID="6xxxxxxxxxxxxxxxxxxxxxxxxr"
AWS_COGNITO_CLIENT_SECRET="1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1"
AWS_COGNITO_USER_POOL_ID="xxxxxxxxxxxxxxxxx"
AWS_COGNITO_REGION="xxxxxxxxxxx" //optional - default value is 'us-east-1'
AWS_COGNITO_VERSION="latest" //optional - default value is 'latest'

有关如何找到您的应用程序的AWS_COGNITO_CLIENT_ID、AWS_COGNITO_CLIENT_SECRET和AWS_COGNITO_USER_POOL_ID的更多详细信息,请参阅COGNITOCONFIG文件

将现有用户导入到Cognito池中

如果您已经在现有的项目中工作,并希望集成Cognito,您必须将用户csv文件导入到您的Cognito池中

用法

我们的包为您提供了5个特质,您可以将其添加到Auth控制器中,以便使包运行。

  • Ellaisys\Cognito\Auth\AuthenticatesUsers
  • Ellaisys\Cognito\Auth\RegistersUsers
  • Ellaisys\Cognito\Auth\ResetsPasswords
  • Ellaisys\Cognito\Auth\SendsPasswordResetEmails
  • Ellaisys\Cognito\Auth\VerifiesEmails

以最简单的方式,您只需遍历您的Auth控制器,将特质从目前由Laravel实现的命名空间中更改即可。

您可以根据需要更改结构。请注意,blade文件中的@extend语句以适应您的项目结构。在当前状态下,您需要在这里定义以下4个表单字段。这些是tokenemailpasswordpassword_confirmation

单点登录

通过我们的包和AWS Cognito,我们为您提供了一种简单的方法来使用单点登录。有关配置选项,请参阅配置cognito.php

当您想要启用SSO并尝试登录您的应用程序时,该包会检查用户是否存在于您的AWS Cognito池中。如果用户存在,并且add_missing_local_user_sso设置为true,则用户将被自动创建并同时在您的数据库中登录。

这就是我们使用字段 sso_user_modelcognito_user_fields 的原因。在 sso_user_model 中,你定义用户模型的类型。在大多数情况下,这将是简单的 App\User

使用 cognito_user_fields,你可以定义应存储在 Cognito 中的字段。请注意。如果你定义了一个在注册请求中没有发送的字段,这将抛出 InvalidUserFieldException,并且你将无法注册。

现在你已经将具有属性的用户注册到 AWS Cognito 池和你的数据库中,并且你想附加一个应该使用相同池的第二个应用程序。实际上,这很简单。你可以使用允许多个项目消费同一 AWS Cognito 池的 API 配置。

**重要提示:** 如果你的用户表有一个密码字段,你将不再需要它。你需要做的是将此字段设置为可空的,这样就可以在没有密码的情况下创建用户。从现在开始,密码将存储在 Cognito 中。

任何额外的注册数据,例如 firstnamelastname,需要添加到 cognito.php 中的 cognito_user_fields 配置,以便推送到 Cognito。否则,它们只会在本地存储,并且在你想使用单点登录时不可用。

API 路由的中间件配置

如果你将此库用作 API 驱动程序,你可以在 kernal.php 的 $routeMiddleware 中注册中间件。

```
protected $routeMiddleware = [
    ...
    'aws-cognito' => \Ellaisys\Cognito\Http\Middleware\AwsCognitoAuthenticate::class
]
```

要使用中间件进行路由,如下所示

```
Route::middleware('aws-cognito')->get('user', 'NameOfTheController@functionName');
```

如果你使用 API 身份验证守卫,请确保将授权令牌添加到请求头中。为确保应用程序获取请求头数据,请在 htaccess .htaccess 文件中添加以下行

```
RewriteEngine On

# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
```

注册用户

默认情况下,如果你使用 Cognito 注册新用户,Cognito 将在 signUp 期间发送一封电子邮件,用户可以在其中验证自己。如果用户现在点击电子邮件中的链接,他将被重定向到 Cognito 提供的确认页面。在大多数情况下,这不是你想要的。你希望用户留在你的页面上。

我们已经找到了一种绕过这种默认行为的好方法。

  1. 你需要为用户创建一个额外的字段来存储验证令牌。此字段必须为可空的。

  2. 创建一个事件监听器,该监听器在用户注册后触发。

  3. 在此事件监听器中,你生成一个令牌并将其存储在上面的字段中。

  4. 你创建一封电子邮件并将存储在链接中的令牌发送给用户。

  5. 链接应指向一个控制器动作,在该动作中,你首先检查是否存在具有此令牌的用户。如果数据库中存在这样的用户,你将调用 Cognito 并将用户属性设置为 email_verified 为 true 并确认注册。

     public function verifyEmail(
            $token,
            CognitoClient $cognitoClient,
            CognitoUserPropertyAccessor $cognitoUserPropertyAccessor
        ) {
            $user = User::whereToken($token)->firstOrFail();
    
            $user->token = null;
            $user->save();
    
            $cognitoClient->setUserAttributes($user->email, [
                'email_verified' => 'true',
            ]);
    
            if ($cognitoUserPropertyAccessor->getUserStatus($user->email) != 'CONFIRMED') {
                $cognitoClient->confirmSignUp($user->email);
                return response()->redirectToRoute('login');
            }
    
            return response()->redirectToRoute('dashboard');
        }
    
  6. 现在你需要关闭 Cognito 发送电子邮件。进入你的 AWS 账户并导航到 Cognito 部分。选择你的用户池并点击 MFA and verifications。您将看到标题:你是否想要要求验证电子邮件或电话号码? 你必须在这里取消选中所有选中的字段。完成后,你应该看到一个红色警告:你没有选择电子邮件或电话号码验证,因此你的用户将无法在没有联系你寻求支持的情况下恢复密码。

  7. 现在你已经告诉 Cognito 在用户在你的应用程序上注册时停止发送消息,你可以自己处理它。

作为旁注:忘记密码的邮件将通过Cognito触发。您无法关闭它们,因此请确保按照您的需求设计这些邮件。同时,请确保从正确的“发件人”地址发送邮件。

删除用户

如果您想允许用户从您的应用程序中删除自己,您可以使用CognitoClient的deleteUser函数。

要删除用户,您应该调用deleteUser函数,并将用户的电子邮件地址作为参数传递给它。在您的Cognito池中删除用户后,也要从您的数据库中删除该用户。

    $cognitoClient->deleteUser($user->email);
    $user->delete();

我们已经实现了一个新的配置选项delete_user,您可以通过AWS_COGNITO_DELETE_USER环境变量来访问它。如果您将此配置设置为true,用户将在Cognito池中被删除。如果设置为false,它将保持注册状态。默认情况下,此选项设置为false。如果您想使用此行为,应将USE_SSO设置为true,以便在用户成功登录后恢复自己。

要访问我们的CognitoClient,您只需将其作为参数传递到您要执行删除操作的Controller Action中。

    public function deleteUser(Request $request, AwsCognitoClient $client)

Laravel会自动处理依赖注入。

    IMPORTANT: You want to secure this action by maybe security questions, a second delete password or by confirming 
    the email address.

更新日志

有关最近更改的更多信息,请参阅更新日志

安全

如果您发现任何与安全相关的问题,请通过support@ellaisys.com发送电子邮件,并将其添加到问题跟踪器中。

致谢

支持我们

EllaiSys是一家专注于云计算(AWS和Azure)、DevOps和产品工程的网络和咨询公司。我们专长于LAMP和Microsoft堆栈开发。您可以在我们的网站上找到我们做什么的概述(点击访问)

许可协议

MIT许可协议(MIT)。有关更多信息,请参阅许可文件