在本文中,您将了解如何使用 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 仪表板上的Applications > Default App > Settings下找到大部分设置。请注意,我使用的是系统创建的默认应用程序。当然,如果您愿意,您可以继续创建一个新应用程序。
这AUTH0_CALLBACK_URL
是您的应用程序的 URL,Auth0 将在登录和注销后重定向用户。您在此字段中设置的值必须 在 Auth0 仪表板上的应用程序设置中的允许回调 URL下进行配置。
使用电子邮件无密码登录
要使用电子邮件启用无密码登录,请转到Auth0 仪表板上的连接 > 无密码并启用电子邮件选项。
在大多数情况下,电子邮件下的默认配置设置 开箱即用。当然,如果您想更改任何设置,请继续执行此操作。不要忘记在Connections > Passwordless > Email > Applications中启用您想要无密码身份验证的应用程序。
完成初始设置后,我们可以继续创建一个使用电子邮件实现无密码登录的文件。
实现无密码登录
继续创建包含以下内容的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="https://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 和环境变量相关类的自动加载器。
之后,我们使用该函数从.env文件初始化配置变量。getenv
接下来,我们调用了getUser
Auth0 对象的方法来检查是否存在任何活动会话。基于此,SignIn
如果没有活动会话,我们会显示链接。Logout
否则,将显示带有链接的登录用户的用户名。
继续运行email_auth_example.php文件来测试您的应用程序!
使用 SMS 无密码登录
要使用 SMS 启用无密码登录,请转到Auth0 仪表板上的Connections > Passwordless并启用SMS选项。默认情况下,Auth0 使用 Twilio 服务发送消息。因此,继续为自己获取一个 Twilio 帐户。
从 Twilio 仪表板中,获取您的ACCOUNT SID和AUTH TOKEN ,然后在 Auth0 仪表板上的Connections > Passwordless > SMS > Settings的Twilio SID和Twilio AuthToken字段中输入这些值 。
此外,您需要在 Twilio 仪表板上的SMS > Messaging services中创建新的消息服务。成功创建服务后,您将获得Service ID,这就是您需要在Connections > Passwordless > SMS > Settings的Copilot SID字段中输入的内容。
最后,让我们看一下使用 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(); };
一切都几乎相同,除了我们提供sms
而不是email
在allowedConnections
属性中提供。
继续运行sms_auth_example.php文件来测试您的应用程序!
结论
今天,我们研究了使用 Auth0 服务的无密码登录。在可用的可能方法中,我们使用代码示例实现了电子邮件和 SMS 方法。
- 安装依赖项
- 配置环境变量
- 实现无密码登录