首页 » 漏洞 » 在 IBM Bluemix 应用程序中使用 PHP 和 Passport 服务轻松管理和验证用户,第 1 部分: 无需从头开...

在 IBM Bluemix 应用程序中使用 PHP 和 Passport 服务轻松管理和验证用户,第 1 部分: 无需从头开...

 
文章目录

在 IBM Bluemix 应用程序中使用 PHP 和 Passport 服务轻松管理和验证用户,第 1 部分

无需从头开始即可为应用程序添加用户验证和管理功能

加快开发工作,让您能将精力集中在应用程序更为独特的方面

在 IBM Bluemix 应用程序中使用 PHP 和 Passport 服务轻松管理和验证用户,第 1 部分: 无需从头开...

Vikram Vaswani

2017 年 10 月 11 日发布

系列内容:

此内容是该系列 # 部分中的第 # 部分: 在 IBM Bluemix 应用程序中使用 PHP 和 Passport 服务轻松管理和验证用户,第 1 部分

https://www.ibm.com/developerworks/cn/library/?series_title_by=**auto**

敬请期待该系列的后续内容。

此内容是该系列的一部分: 在 IBM Bluemix 应用程序中使用 PHP 和 Passport 服务轻松管理和验证用户,第 1 部分

敬请期待该系列的后续内容。

我发现每次编写新的 Web 应用程序时,有两个任务是必须完成的:创建一个可以添加、修改和删除用户的仪表板,实现一个登录/注销工作流。正如您所想象的,这两个任务在构建任何大小合理的应用程序时都无法避免……但它们已经实现了高度标准化且为人熟知,所以实现它们对大部分开发人员而言只是一种枯燥的例行工作。

在寻找更好(不那么乏味的)方法的过程中,我偶然发现了 IBM Bluemix 的 Passport 服务集成,它让开发人员能将用户管理和身份验证的所有实现细节外包给外部 API。这大大减少了在开发新应用程序时需要编写(和测试)的代码量……而且,额外的好处是能快速实现 “用户登录” 功能,让您可以继续完成其他更重要的工作。

这个教程分两部分,我将介绍如何构建一个简单的 Web 应用程序并将其部署到 Bluemix 上。这个示例应用程序支持多用户,但我不会编写任何用户管理代码;相反,我将集成 Bluemix 的 Passport 服务,让它处理所有的麻烦工作。请继续阅读!

运行代码示例 在 GitHub 上获取代码

您需要做的准备工作

应用程序中的用户管理通常涉及到创建一个用户仪表板,使用该仪表板可添加新用户,编辑现有用户,以及激活、停用或删除用户帐户。通常还需要为用户提供一种登录到应用程序和从中注销的方法,以及允许用户访问某些功能前检查用户是否已通过验证。一些应用程序还有其他特性,比如基于角色的访问、用户概要文件,以及处理用户忘记密码和用户再激活的其他工作流。

不熟悉 Bluemix?

仍在了解如何开始使用 Bluemix?请访问 IBM Bluemix 开发人员中心 了解更多信息。在做好亲手实践的准备后,您可以免费试用它 30 天!

在幕后,实现所有这些功能通常(至少)涉及到创建一个用户数据库,使用安全算法来加密和验证用户密码,以及编写 SQL 查询来创建、更新、删除和验证用户。有了 Bluemix 的 Passport 集成功能,无需创建用户数据库或编写 SQL;通过对 Passport 服务执行 API 调用即可完成所有这些任务。

因为 Passport API 符合 REST 规范,所以可使用任何编程语言访问它;在本文中我将使用 PHP。我还将使用 Bootstrap 创建一个移动优化的接口,使用 Slim PHP 微框架管理应用程序流,使用 Guzzle PHP 客户机访问 Passport API,使用 Bluemix 提供基础架构和托管服务。

开始前请确保您完成了所需的准备工作:

备注:任何使用 Passport 服务的应用程序都必须遵守 Inversoft 许可协议 。同样,任何使用 Bluemix 的应用程序都必须遵守 这里规定的 Bluemix 使用条款。开始实施您的项目之前,花几分钟阅读一下这些要求,确保您的应用程序满足这些要求。

第 1 步:创建应用程序框架

第一步是使用 Slim PHP 微框架和 Guzzle PHP HTTP 客户机初始化一个基本应用程序。这些依赖项可以使用 Composer(PHP 依赖项管理器)轻松下载和安装。使用这个 Composer 配置文件,应该将它保存到 $APP_ROOT/composer.json($APP_ROOT 是您的项目目录):

{     "require": {         "slim/slim": "*",         "slim/php-view": "*",         "guzzlehttp/guzzle": "*"     } }

接下来,使用 Composer 通过以下命令进行安装:

shell> php composer.phar install

通过 Composer 下载必要的组件后,创建两个目录:$APP_ROOT/public 存放所有可通过网络访问的文件,$APP_ROOT/views 存放所有视图。

shell> cd myapp shell> mkdir public views

然后创建 $APP_ROOT/config.php 文件,其中包含以下信息(将在第 3 步填入占位符中的内容):

<?php $config = [   'settings' => [     'displayErrorDetails' => true, // disable for production     'passport_api_key' => 'PASSPORT-API-KEY',     'passport_api_url' => 'PASSPORT-API-URL',     'passport_app_id'  => 'PASSPORT-APP-ID',   ] ];

要使应用程序更容易访问,可在开发环境中定义一个名为 “myapp.localhost” 的新虚拟主机,并将它的文档根目录指向 $APP_ROOT/public。还应向 $APP_ROOT/public 目录添加一个 .htaccess 文件,其中包含以下设置:

<IfModule mod_rewrite.c>   RewriteEngine On   RewriteCond %{REQUEST_FILENAME} !-f   RewriteCond %{REQUEST_FILENAME} !-d   RewriteRule ^ index.php [QSA,L] </IfModule>

使用一个映射到 $APP_ROOT/public 目录的虚拟主机后,可以使用虚拟主机名直接访问应用程序的路由 — 例如,http://myapp.localhost/admin/users/index,而不是 http://localhost/public/admin/users/index。要进一步了解 Slim 框架应用程序的虚拟主机和 Web 服务器配置,请参阅 Slim 文档针对 Apache 的 Slim 配置Composer 文档

下一步是创建一个将初始化 Slim 框架的控制器脚本。它还包含对应用程序的路由的回调,每个回调定义了在该路由与一个传入请求匹配时要执行的代码。在 $APP_ROOT/public/index.php 上创建一个包含以下内容的脚本:

<?php use /Psr/Http/Message/ServerRequestInterface as Request; use /Psr/Http/Message/ResponseInterface as Response; use GuzzleHttp/Client; use GuzzleHttp/Exception/ClientException;  require '../vendor/autoload.php'; require '../config.php';  // configure Slim application instance // initialize application $app = new /Slim/App($config);  // initialize dependency injection container $container = $app->getContainer();  // add view renderer $container['view'] = function ($container) {   return new /Slim/Views/PhpRenderer("../views/"); };  // index page handler $app->get('/', function (Request $request, Response $response) {   return $response->withHeader('Location', $this->router->pathFor('home')); });  // public page handler $app->get('/home', function (Request $request, Response $response) {   return $this->view->render($response, 'home.phtml', [     'router' => $this->router   ]); })->setName('home');  $app->run();

Slim 通过定义 HTTP 方法和端点的回调函数进行工作。要完成此任务,可调用相应的 Slim 方法 — get() 用于处理 GET 请求, post() 用于处理 POST 请求等 — 并传递要匹配的路由作为该方法的第一个参数。该方法的第二个参数是一个匿名函数,它指定了在路由与某个传入的请求相匹配时应执行的操作。

上述脚本设置两个处理程序(我们很快添加更多处理程序)。第一个是一种简单的重定向,它将对 “/” 路由的所有请求重定向到 “/home” 路由。第二个是 “/home” 路由本身,它呈现 $APP_ROOT/views/home.phtml 文件的内容。创建此文件并添加以下内容:

<!DOCTYPE html> <html lang="en">   <head>     <meta charset="utf-8">     <meta http-equiv="X-UA-Compatible" content="IE=edge">     <meta name="viewport" content="width=device-width, initial-scale=1">     <title>My App</title>     <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">     <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">     <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->     <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->     <!--[if lt IE 9]>       <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>       <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>     <![endif]-->       </head>   <body>      <div class="container">       <!-- header area -->       <div class="panel panel-default">         <div class="panel-heading clearfix">           <h4 class="pull-left">Home</h4>           <div class="btn-group pull-right">             <a role="button" class="btn btn-primary" href="<?php echo $data['router']->pathFor('home'); ?>">Home</a>           </div>         </div>       </div>         <!-- end of header area -->              <!-- content area -->       <p>This is the home page. It is public and accessible to everyone.</p>       <!-- end of content area -->              <!-- footer -->       <div class="container">       </div>        <!-- end of footer -->     </div>     </body> </html>

此模板包含一个基于 Bootstrap 的简单用户界面,该用户界面包含页眉、页脚和内容区域。所有后续页面也会使用这个基本模板,而且只有内容区域将更改。

要查看此模板的实际效果,可浏览到 “/home” 路由(http://myapp.localhost/home 或 http://localhost/public/home,具体取决于您是否使用虚拟主机),您应该看到上述模板的呈现效果:

图 1. 静态主页

在 IBM Bluemix 应用程序中使用 PHP 和 Passport 服务轻松管理和验证用户,第 1 部分: 无需从头开...

在 IBM Bluemix 应用程序中使用 PHP 和 Passport 服务轻松管理和验证用户,第 1 部分: 无需从头开...

第 2 步:创建用户注册表单

设置基本的应用程序框架后,可以开始构建应用程序的剩余部分了。实现用户管理功能的第一步是创建一个可注册新应用程序用户的表单,其中包含所需的最少字段。首先将以下代码添加到 $APP_ROOT/public/index.php,定义一个 “/admin/users/save” 路由和对应的回调函数:

<?php  // Slim application initialization - snipped  // user form handler $app->get('/admin/users/save', function (Request $request, Response $response) {   $response = $this->view->render($response, 'users-save.phtml', [     'router' => $this->router   ]);   return $response; })->setName('admin-users-save');  // other callbacks

基本来讲,这段代码告诉 Slim 使用指定模板的内容来响应对 /admin/users/save URL 端点的 GET 请求。该模板位于 $APP_ROOT/views/users-save.phtml,应包含创建新用户所需的表单字段。以下是代码:

<div>   <form method="post" action="<?php echo $data['router']->pathFor('admin-users-save'); ?>">     <div class="form-group">       <label for="fname">First name</label>       <input type="text" class="form-control" id="fname" name="fname">     </div>     <div class="form-group">       <label for="lname">Last name</label>       <input type="text" class="form-control" id="lname" name="lname">     </div>     <div class="form-group">       <label for="email">Email address</label>       <input type="text" class="form-control" id="email" name="email">     </div>     <div class="form-group">       <label for="password">Password</label>       <input type="password" class="form-control" id="password" name="password">     </div>      <div class="form-group">       <button type="submit" name="submit" class="btn btn-default">Save</button>     </div>   </form>   </div>

简明扼要!它只需要用户的名字、姓氏、电子邮箱地址和密码。电子邮箱地址也在登录时用作唯一标识符。

在浏览器中访问 “/admin/users/save” 路由时,您应看到类似这样的界面:

图 2. 用户帐户创建表单

在 IBM Bluemix 应用程序中使用 PHP 和 Passport 服务轻松管理和验证用户,第 1 部分: 无需从头开...

在 IBM Bluemix 应用程序中使用 PHP 和 Passport 服务轻松管理和验证用户,第 1 部分: 无需从头开...

现在已完成了添加新用户的入口点。下一步是处理在表单中提交的数据,首先需要您配置 Passport 服务并将它与 Bluemix 集成。

第 3 步:配置 Passport 服务

要想开始使用 Passport API,需要 3 种信息:API 密钥、API URL 和应用程序 ID。要配置 Bluemix 服务实例,还需要您的 Passport 实例的后端 URL(通常与 API URL 相同)和前端 URL。可用以下方式收集这些信息:

  • 首次注册 Passport 帐户时,会看到一个成功页面,其中包含 API URL、前端 URL 和后端 URL。如果您当时未记下它们,以后可从 Inversoft 网站上的帐户页面 访问这些信息。这是该页面的示例:

    图 3. Passport URL

    在 IBM Bluemix 应用程序中使用 PHP 和 Passport 服务轻松管理和验证用户,第 1 部分: 无需从头开...

    在 IBM Bluemix 应用程序中使用 PHP 和 Passport 服务轻松管理和验证用户,第 1 部分: 无需从头开...
  • 在 Passport 设置过程中,Passport 设置向导会提示您设置一个 API 密钥。如果您当时未记下它,可以浏览到 Passport 前端 URL 并使用您的管理员帐户凭证登录。然后从 “Settings -> API Keys” 菜单中获取 API 密钥。这是该页面的示例:

    图 4. Passport API 密钥

    在 IBM Bluemix 应用程序中使用 PHP 和 Passport 服务轻松管理和验证用户,第 1 部分: 无需从头开...

    在 IBM Bluemix 应用程序中使用 PHP 和 Passport 服务轻松管理和验证用户,第 1 部分: 无需从头开...