本帖最后由 游龙 于 2018-4-26 15:21 编辑
一、简介 Laravel通过传统的登录表单已经让用户认证变得很简单,但是API认证怎么实现?API通常使用令牌(token)进行认证并且在请求之间不维护会话(session)状态。Laravel官方扩展包Laravel Passport让API认证变得轻而易举,Passport基于Alex Bilbie维护的Leagur Oauth2 server,可以在数分钟内为Laravel应用提供完整的Oauth2服务器实现。 二、OAuth21、什么是Oauth协议 OAuth是Open Authorization的简写,OAuth协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是Oauth的授权不会使用第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAuth是安全的。 OAuth本身不存在一个标准的实现,后端开发者自己根据实际的需求和标准的规定实现。其步骤一般如下: - 客户端要求用户给予授权
- 用户同意给予授权
- 根据上一步获得的授权,向认证服务器请求令牌(token)
- 认证服务器对授权进行认证,确认无误后发方向令牌
- 客户端使用令牌向资源服务器请求资源
2、OAuth2解决什么问题 任何身份认证,本质上都是基于对请求方的不信任所产生的。同时,请求方是信任被请求方的,例如用户请求服务时,会信任服务方。所以,身份认证就是为了解决身份的可信任问题。 在OAuth 中,简单来说有三方:用户(这里是指属于服务方的用户)、服务方、第三方应用(客户端)。 服务方不信任用户,所以需要提供密码或其他可信凭据; 服务方不是信任第三方,所以需要第三方提供自己交给它的凭据(通常的一些安全签名之类的就是); 用户部分信任第三方,所以用户愿意把自己在服务方里的某些服务交给第三方使用,但不愿意把自己在服务方的密码交给第三方;
在OAuth的流程中,用户登录了第三方的系统后,会先跳去服务方获取一次性用户授权凭据,再跳回来把它交给第三方,第三方的服务器会把授权凭据以及服务方给它的身份凭据一起交给服务方,这样,服务方一可以确定第三方得到了用户对此次服务的授权(根据用户授权凭据),二可以确定第三方的身份是可信任的(根据身份凭据),所以,最终的结果就是,第三方顺利地从服务方获取到了此次所请求的服务。
从上面的流程中可以看出,OAuth完整地解决掉用户、服务方、第三方在某次服务时这三者之间的信任问题。 3、OAuth基本流程涉及成员: - Resource Owner(资源拥有者:用户)
- Client(第三方接入平台:请求者)
- Resource Server(服务器资源:数据中心)
- Authorization Server(认证服务器)
注意: Passport需要你对OAuth2非常熟悉才能自如使用,上面关于OAuth2的概览转自理解OAuth2.0认证,更多 关于OAuth2模式的探讨,还可以参考阮一峰博客:理解OAuth2.0。 三、安装1、安装Laravel框架#> composer create-project --prefer-dist laravel/laravel 项目名称 版本号
注:本案例中使用Laravel5.5.*版本 2、安装passport1)首先通过composer包管理器安装passport #> composer require laravel/passport [ 版本号 ]
注意:如果安装过程中提示需要更高版本的Laravel:laravel/passportv5.0.0 requires illuminate/http ~5.6,可以通过指定版本来安装 composer require laravel/passport ~4.0
2)Passport服务提供者为框架注册了自己的数据库迁移目录,所以在注册服务提供都之后(Laravel5.5之后会自动注册服务提供都)需要迁移数据库,Passport迁移将会为应用生成用于存放客户端和访问令牌的数据表: #> php artisan migrate 注意: 执行以上指令之前得配置好数据库,否则会报以下错误: 数据库配置成后,再执行以上指令,有可以报以下图所示: 执行成功的结果以下图所示:
注意:如果你不想使用 Passport的默认迁移,需要在 AppServiceProvider 的register 方法中调用 Passport::ignoreMigrations 方法。你可以使用 php artisan vendor:publish --tag=passport-migrations 导出默认迁移。
3)接下来,需要运行passport:install命令,该命令将会创建生成安全访问令牌(token)所需的加密键,此外,该命令还会创建”personal access”和”password grant”客户端用于生成访问令牌: #> php artisan passport:install
4)生成记录存放在数据表oauth_clients中,如下图所示: 5)把Laravel\Passport\HasApiTokenstrait 到 App\User 模型,该 trait 将会为模型类提供一些辅助函数用于检查认证用户的 token 和 scope:
6)在AuthServiceProvider 的 boot 方法中调用 Passport::routes 方法,该方法将会为颁发访问令牌、撤销访问令牌、客户端以及私人访问令牌注册必要的路由: 注意:需要引入use Laravel\Passport\Passport;类
7)在配置文件config/auth.php 中,需要设置 api 认证guard 的 driver 选项为 passport。这将告知应用在认证输入的 API 请求时使用 Passport 的 TokenGuard;如下图所示: 四、开始编写API之路1、创建控制器#> php artisan make:controller Api\PassportController
1)定义login( )方法,如下图所示:
2)定义register ( )方法,如下图所示:
3)定义getDetails ( )方法,如下图所示: 2、定义路由配置 routes/api.php ,增加相应API路由配置,如下图所示:
3、我们使用Postman测试API可以在谷歌浏览器插件里可以安装它或单独安装 1)首先,我们来测试一下注册用户的API( Register API ) 2)然后,我们来测试一下用户登录的API( Login API )
3)再然后,我们来测试一下获取数据的API( Get Detailss API ) 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer '.$accessToken,
|