使用 Lumen + Stormpath 为移动 App 提供后端 API

lumen-stormpath
1、概述

Stormpath 致力于为开发者提供用户认证 API,通过 Stormpath 我们可以快速搭建起用户认证系统。最近,Stormpath 官方将Lumen 集成到 Stormpath 的 PHP SDK 中(在此之前 Laravel 与 Stormpath 的集成已经做好:stormpath-laravel),这样,你只需要花费几分钟的时间就可以为移动 App 提供一个 PHP 后端,通过与 Lumen 的集成(stormpath-lumen),你可以快速使用 OAuth Token 实现用户注册及登录功能。

本教程将会将会你如何安装一个新的Lumen应用并配置在移动App中使用。

2、安装Lumen应用

在正式开始之前,我们假设你已经具备以下知识储备:

  • 对Lumen的基本了解(Lumen中文文档:http://laravelacademy.org/lumen-docs
  • PHP 5.6及以上版本的开发环境
  • PHP OpenSSL扩展
  • PHP PDO扩展
  • PHP Mbstring扩展
  • 基本的命令行知识
  • 已经安装Composer
  • 已经安装并配置好Git

如果没有请参考相应文档或自行Google。

Lumen的安装这里我也不想赘述,请自行参考官方中文文档:http://laravelacademy.org/post/3361.html

这里我们使用Lumen安装器安装新的Lumen应用:

lumen new lumen-stormpath-mobile-backend

安装完成后我们在浏览器中访问http://lumen-stormpath-mobile-backend.dev(我使用的是Mac Valet开发环境),页面显示如下信息:

Lumen (5.2.6) (Laravel Components 5.2.*)

表明安装成功。

3、安装Lumen Stormpath

Stormpath秉承的宗旨是创造便于使用和理解的有用工具,Stormpath Lumen也不例外。我们使用Composer来安装Stormpath Lumen扩展包,首先在根目录下composer.json文件的require部分新增如下这行:

"stormpath/lumen": "^0.1"

然后运行composer update命令执行更新操作:

composer-install-stormpath-lumen
安装完成后,需要到bootstrap/app.php中注册服务提供者:

$app->register(App\Providers\AppServiceProvider::class);
$app->register(App\Providers\AuthServiceProvider::class);
$app->register(App\Providers\EventServiceProvider::class);
$app->register(\Stormpath\Lumen\Support\StormpathServiceProvider::class);

接下来我们需要为这个服务提供者提供一个 API key,要实现这一目的,需要注册Stormpath账号(注册地址:https://api.stormpath.com/register),注册完成后,登录到后台查看你的API信息:

stormpath-create-api-key

点击“Create API Key”创建并获取自己的第一个API Key和API Secret。

然后在Lumen应用根目录下的.env中配置Stormpath API信息:

STORMPATH_CLIENT_APIKEY_ID={YOUR API KEY ID FROM FILE}
STORMPATH_CLIENT_APIKEY_SECRET={YOUR API KEY SECRET FROM FILE}

接下来还要配置一个选项STORMPATH_APPLICATION_HREF,这需要到Stormpath后台创建一个应用,比如这里我创建一个Laravel Academy,创建完成后可以在应用详情中查看HREF信息:

stormpath-api-href
我们将这里的HREF配置到.env中:

STORMPATH_APPLICATION_HREF={YOUR APPLICATION HREF}

至此,安装配置环节告一段落,接下来我们就要来认证移动App的账户了。

4、移动账户认证

在移动App中路由会有一点不同,这是由于认证的工作方式不同造成的。一开始你可能只想发送一个POST请求到/login路由,但我们不推荐这么做,我们建议发送POST请求到/oauth/token路由,该路由会返回access_tokenrefresh_token以便后续使用。请求头可能是这样子:

POST /oauth/token HTTP/1.1
Host: localhost:8000
Accept: application/json
Content-Type: application/json
Cache-Control: no-cache

{
    "password": "superP4ssw0rd!",
    "username": "brian@stormpath.com",
    "grant_type": "password"
}

对应的返回信息如下:

{
     "access_token": "eyJraWQiOiIxUE4zRlhJMFU3OUUyTUhDRjZYVVlHVTRaIiwiYWxnIjoiSFMyNTYifQ.eyJqdGki...3In0.i1diirJdpcQh1TA8oIya8-86tes_xlauaTwsuKS67gY",
     "expires_in": 3600,
     "refresh_token": "eyJraWQiOiIxUE4zRlhJMFU3OUUyTUhDRjZYVVlHVTRaIiwiYWxnIjoiSFMyNTYifQ.eyJqdGki...AxfQ.oMEcM9T1K8SptKxKLaUYiJ37whlvhGVoFcRDLAxzjw8",
     "token_type": "Bearer"
 }

5、保护路由

Stormpath Lumen扩展包还提供了几个路由中间件过滤器,这些中间件和Lumen中间件一样可以添加到路由。如果你期望某些路由只对认证用户开放,可以添加stormpath.auth中间件到路由,这样,当传递access_token作为一个Authorization头的时候,中间件会基于这个token判断并确保经过认证的用户才能访问这个路由。对另外一些只有访客才能访问的路由,可以使用stormpath.guest中间件,该中间件会判断没有传递access_token的用户才能访问。

6、集成Stormpath移动SDK

Stormpath移动SDK在这个扩展包中都能正常使用,无论是iOS还是Android。更多详情请参考对应Android文档iOS文档

学院君

学院君 has written 554 articles

资深PHP工程师,Laravel学院院长