使用 Lumen + Stormpath 为移动 App 提供后端 API
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中文文档:https://laravel.geekai.co/lumen-docs)
- PHP 5.6及以上版本的开发环境
- PHP OpenSSL扩展
- PHP PDO扩展
- PHP Mbstring扩展
- 基本的命令行知识
- 已经安装Composer
- 已经安装并配置好Git
Lumen的安装这里我也不想赘述,请自行参考官方中文文档:https://laravel.geekai.co/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
命令执行更新操作:
安装完成后,需要到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信息:
点击“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_APPLICATION_HREF={YOUR APPLICATION HREF}至此,安装配置环节告一段落,接下来我们就要来认证移动App的账户了。
4、移动账户认证
在移动App中路由会有一点不同,这是由于认证的工作方式不同造成的。一开始你可能只想发送一个POST请求到/login
路由,但我们不推荐这么做,我们建议发送POST请求到/oauth/token
路由,该路由会返回access_token
和refresh_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
的用户才能访问。
5 Comments