ellaisys / telephony-exotel
云电话库 - Exotel
Requires
- php: ^7.0|^8.0
- guzzlehttp/guzzle: ^6.0|^7.0
Requires (Dev)
- phpunit/phpunit: ^8.5
This package is auto-updated.
Last update: 2024-09-08 18:14:11 UTC
README
基于PHP/Laravel的云电话包,提供Exotel服务
本包提供了一种简单的方法,在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个表单字段。这些是token
、email
、password
、password_confirmation
。
单点登录
通过我们的包和AWS Cognito,我们为您提供了一种简单的方法来使用单点登录。有关配置选项,请参阅配置cognito.php。
当您想要启用SSO并尝试登录您的应用程序时,该包会检查用户是否存在于您的AWS Cognito池中。如果用户存在,并且add_missing_local_user_sso
设置为true
,则用户将被自动创建并同时在您的数据库中登录。
这就是我们使用字段 sso_user_model
和 cognito_user_fields
的原因。在 sso_user_model
中,你定义用户模型的类型。在大多数情况下,这将是简单的 App\User。
使用 cognito_user_fields
,你可以定义应存储在 Cognito 中的字段。请注意。如果你定义了一个在注册请求中没有发送的字段,这将抛出 InvalidUserFieldException,并且你将无法注册。
现在你已经将具有属性的用户注册到 AWS Cognito 池和你的数据库中,并且你想附加一个应该使用相同池的第二个应用程序。实际上,这很简单。你可以使用允许多个项目消费同一 AWS Cognito 池的 API 配置。
**重要提示:** 如果你的用户表有一个密码字段,你将不再需要它。你需要做的是将此字段设置为可空的,这样就可以在没有密码的情况下创建用户。从现在开始,密码将存储在 Cognito 中。
任何额外的注册数据,例如 firstname
、lastname
,需要添加到 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 提供的确认页面。在大多数情况下,这不是你想要的。你希望用户留在你的页面上。
我们已经找到了一种绕过这种默认行为的好方法。
-
你需要为用户创建一个额外的字段来存储验证令牌。此字段必须为可空的。
-
创建一个事件监听器,该监听器在用户注册后触发。
-
在此事件监听器中,你生成一个令牌并将其存储在上面的字段中。
-
你创建一封电子邮件并将存储在链接中的令牌发送给用户。
-
链接应指向一个控制器动作,在该动作中,你首先检查是否存在具有此令牌的用户。如果数据库中存在这样的用户,你将调用 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'); }
-
现在你需要关闭 Cognito 发送电子邮件。进入你的 AWS 账户并导航到 Cognito 部分。选择你的用户池并点击
MFA and verifications
。您将看到标题:你是否想要要求验证电子邮件或电话号码?
你必须在这里取消选中所有选中的字段。完成后,你应该看到一个红色警告:你没有选择电子邮件或电话号码验证,因此你的用户将无法在没有联系你寻求支持的情况下恢复密码。
-
现在你已经告诉 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)。有关更多信息,请参阅许可文件。