在本文中,您将学习如何使用Auth0服务设置无密码身份验证。 Auth0允许您外包应用程序的身份验证功能。
什么是Auth0?
Auth0是一种身份验证即服务工具,可轻松实现您的应用或网站与身份验证相关的功能的实现。 如果您已经构建了一个应用程序并且只想将身份验证和授权功能外包,则应考虑使用Auth0之类的服务。
让我快速总结一下Auth0提供的功能:
- 单点登录
- 多因素认证
- 无密码登录
- 用户管理
- 以及更多!
最初设定
在本节中,我们将进行初始设置,以准备设置无密码身份验证。
在继续之前,请确保安装Composer,因为它将使用composer.json文件安装实际的Auth0 SDK。 另外,如果您想按照本文中的示例进行操作,请继续使用Auth0免费帐户。
让我们从获取示例项目的克隆开始。
git clone https://github.com/auth0-samples/auth0-php-web-app.git .
安装依赖项
继续运行composer install
命令以安装依赖项。
cd 00-Starter-Seed
composer install
根据composer.json文件,您应该已经安装了vlucas / phpdotenv和auth0 / auth0-php软件包。
{
"name": "auth0/basic-webapp-sample",
"description": "Basic sample for securing a WebApp with Auth0",
"require": {
"vlucas/phpdotenv": "2.4.0",
"auth0/auth0-php": "~5.0"
},
"license": "MIT",
"authors": [
{
"name": "Martin Gontovnikas",
"email": "martin@gon.to"
},
{
"name": "Germán Lena",
"email": "german.lena@gmail.com"
}
]
}
vlucas / phpdotenv库用于初始化.env文件中的环境变量。 因此,它允许您将配置与在环境之间更改的代码分开。
另一方面, auth0 / auth0-php软件包将帮助我们在应用程序中设置授权。
配置环境变量
接下来,让我们在.env文件中为我们的应用设置配置。 继续并通过从.env.example文件中复制该文件来创建.env文件。
cp .env.example .env
它包含将由Auth0库使用的配置值。
AUTH0_CLIENT_ID={CLIENT_ID}
AUTH0_DOMAIN={DOMAIN_NAME}
AUTH0_CLIENT_SECRET={CLIENT_SECRET}
AUTH0_CALLBACK_URL={CALLBACK_URL}
AUTH0_AUDIENCE=
您应该能够在Auth0信息中心的“应用程序”>“默认应用程序”>“设置”下找到大多数设置。 请注意,我使用的是系统创建的默认应用程序。 当然,如果需要,您可以继续创建一个新的应用程序。
AUTH0_CALLBACK_URL
是您的应用程序的URL,Auth0将在登录和注销后重定向用户。 您必须在Auth0仪表板上的应用程序设置中的“ 允许的回调URL”下配置在此字段中设置的值。
使用电子邮件进行无密码登录
要启用使用电子邮件的无密码登录,请转到Auth0仪表板上的“ 连接”>“无密码 ”,然后启用“ 电子邮件”选项。
在大多数情况下,“ 电子邮件”下的默认配置设置可以直接使用。 当然,如果您想更改任何设置,请继续进行。 不要忘记在“ 连接”>“无密码”>“电子邮件”>“应用程序”中启用要进行无密码身份验证的应用程序 。
完成初始设置后,我们可以继续创建一个文件,该文件使用电子邮件实现无密码登录。
实施无密码登录
继续并创建具有以下内容的email_auth_example.php文件。
<?php
// Require composer autoloader
require __DIR__ . '/vendor/autoload.php';
require __DIR__ . '/dotenv-loader.php';
use Auth0\SDK\Auth0;
$domain = getenv('AUTH0_DOMAIN');
$client_id = getenv('AUTH0_CLIENT_ID');
$client_secret = getenv('AUTH0_CLIENT_SECRET');
$redirect_uri = getenv('AUTH0_CALLBACK_URL');
$audience = getenv('AUTH0_AUDIENCE');
if($audience == ''){
$audience = 'https://' . $domain . '/userinfo';
}
$auth0 = new Auth0([
'domain' => $domain,
'client_id' => $client_id,
'client_secret' => $client_secret,
'redirect_uri' => $redirect_uri,
'audience' => $audience,
'scope' => 'openid profile',
'persist_id_token' => true,
'persist_access_token' => true,
'persist_refresh_token' => true,
]);
$userInfo = $auth0->getUser();
?>
<html>
<head>
<script src="http://code.jquery.com/jquery-3.1.0.min.js" type="text/javascript"></script>
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- font awesome from BootstrapCDN -->
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
<link href="//maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css" rel="stylesheet">
<link href="public/app.css" rel="stylesheet">
</head>
<body class="home">
<div class="container">
<div class="login-page clearfix">
<?php if(!$userInfo): ?>
<script src="https://cdn.auth0.com/js/lock/11.6.1/lock.min.js"></script>
<script type="text/javascript">
function login() {
var lock = new Auth0LockPasswordless('<?php echo $client_id; ?>', '<?php echo $domain; ?>', {
allowedConnections: ['email'], // Should match the Email connection name, it defaults to 'email'
passwordlessMethod: 'code', // If not specified, defaults to 'code'
auth: {
redirectUrl: '<?php echo $redirect_uri; ?>',
responseType: 'code'
}
});
lock.show();
}
</script>
<a href="javascript:login()">Passwordless Login Using Email</a>
<?php else: ?>
<div class="logged-in-box auth0-box logged-in">
<h1 id="logo"><img src="//cdn.auth0.com/samples/auth0_logo_final_blue_RGB.png" /></h1>
<img class="avatar" src="<?php echo $userInfo['picture'] ?>"/>
<h2>Welcome <span class="nickname"><?php echo $userInfo['nickname'] ?></span></h2>
<a class="btn btn-warning btn-logout" href="/logout.php">Logout</a>
</div>
<?php endif ?>
</div>
</div>
</body>
</html>
在开始时,我们包括了自动加载器,它们负责加载Auth0和环境变量相关的类。
然后,我们使用getenv
函数从.env文件初始化配置变量。
接下来,我们在Auth0对象上调用了getUser
方法,以检查是否存在任何活动会话。 基于此,如果没有活动会话,我们将显示SignIn
链接。 否则,将显示带有“ Logout
链接的已登录用户的用户名。
继续并运行email_auth_example.php文件来测试您的应用程序!
使用SMS进行无密码登录
要使用SMS启用无密码登录,请转到Auth0仪表板上的连接>无密码 ,然后启用SMS选项。 默认情况下,Auth0使用Twilio服务发送消息。 因此,继续为自己获取Twilio帐户。
在Twilio仪表板上,获取您的ACCOUNT SID和AUTH TOKEN,然后在Auth0仪表板上的“连接”>“无密码”>“ SMS”>“设置”的“ Twilio SID”和“ Twilio AuthToken”字段中输入这些值。
此外,您需要在Twilio仪表板上的SMS>消息服务中创建新的消息服务。 成功创建服务后,您将获得服务ID ,这是您需要在Copilot SID字段中的连接>无密码> SMS>设置中输入的内容 。
最后,让我们看一下使用SMS进行无密码登录的工作方式。 创建sms_auth_example.php文件。 内容与email_auth_example.php相同,不同之处在于login()
函数如下。
function login() {
var lock = new Auth0LockPasswordless('<?php echo $client_id; ?>', '<?php echo $domain; ?>', {
allowedConnections: ['sms'], // Should match the SMS connection name
auth: {
redirectUrl: '<?php echo $redirect_uri; ?>',
responseType: 'code'
}
});
lock.show();
};
一切基本相同,不同之处在于,我们在allowedConnections
属性中提供了sms
而不是email
。
继续并运行sms_auth_example.php文件来测试您的应用程序!
结论
今天,我们研究了使用Auth0服务进行无密码登录。 在可用的可能方法中,我们通过代码示例实现了电子邮件和SMS方法。
欢迎使用下面的Feed留下任何想法或问题!
翻译自: https://code.tutsplus.com/tutorials/secure-passwordless-authentication-using-auth0--cms-31195