8. Laravel5学习笔记:在laravel5中使用OAuth授权

OAuth2.0简介



关于它的介绍,给出以下两篇文章,相信看完,应该对它有一定程度的了解:

[1] 理解OAuth 2.0 —— 阮一峰

[2] 帮你深入理解OAuth2.0协议 —— seccloud

这里我主要阐述的是在laravel5中使用OAuth2.0。关于这个协议本身,以及运行流程希望大家看完以上两篇文章,理解后,再看我后面的内容!

Laravel5中安装OAuth2.0



OAuth2.0在官方中提供了 php的库 ,但是我们这里并不直接使用它官方提供的 Server Libraries ,我们使用github上 oauth2-server-laravel 这个库,它是经过改造,适合 Laravel5 的(Laravel4的安装就选对版本)。

使用教程



其实关于如何使用这个包,在 oauth2-server-laravel 提供的项目已经说得很清楚了,但是文档首先是英文的不便于只管理解,然后有几个小坑,这里用中文转述及补全一下:

安装

首先要用它,就需要先安好它。由于目前Laravel5的稳定版还没有发布,只提供了开发版(这里按照github上的文档安装会出错就是由于提供的版本还没有发布,需要使用开发版),所有安装如下:

"lucadegasperi/oauth2-server-laravel": "[email protected]",
"illuminate/html": "~5.0"

ps:这里安装 illuminate/html 是由于从Laravel5开始这个包就被移除了,然后我们项目中需要使用它,但是它并不是必须的,你可以选择不安装,不安装你在页面中将不能使用 {!! Form::hidden(‘client_id‘, $params[‘client_id‘]) !!} 这种操作。

配置

配置完全可以按照提供的文档来,步骤如下:

  • config/app.phpproviders 数组增加服务提供者
LucaDegasperi\OAuth2Server\Storage\FluentStorageServiceProvider::class,
LucaDegasperi\OAuth2Server\OAuth2ServerServiceProvider::class,
// view中Form表单使用,与OAuth无直接关系,只是为了布局方便
Illuminate\Html\HtmlServiceProvider::class,
  • config/app.phpaliases 数组增加Facades
‘Authorizer‘=> LucaDegasperi\OAuth2Server\Facades\Authorizer::class,
// 与OAuth2.0认证无直接关系,只是为了方便布局使用
‘Form‘      => Illuminate\Html\FormFacade::class,
‘HTML‘      => Illuminate\Html\HtmlFacade::class,
  • 修改app/Http/Kernel.php,配置相关的中间件
    protected $middleware = [
        // 注释掉
        //\App\Http\Middleware\VerifyCsrfToken::class,
        \LucaDegasperi\OAuth2Server\Middleware\OAuthExceptionHandlerMiddleware::class,
    ];

    protected $routeMiddleware = [
        // 增加以下路由,原先的保留
        ‘oauth‘ => \LucaDegasperi\OAuth2Server\Middleware\OAuthMiddleware::class,
        ‘oauth-owner‘ => \LucaDegasperi\OAuth2Server\Middleware\OAuthOwnerMiddleware::class,
        ‘check-authorization-params‘ => \LucaDegasperi\OAuth2Server\Middleware\CheckAuthCodeRequestMiddleware::class,
        ‘csrf‘ => \App\Http\Middleware\VerifyCsrfToken::class,
    ];
  • 执行 php artisan vendor:publish 生成相关的配置文件,你在 config 会看到生成了一个 oauth2.php 文件。
  • 在数据库中生成OAuth2.0需要的数据库表,只需要执行 php artisan migrate 即可,你会在数据库中看到以下表的生成:

  • 选择客户端的授权模式,OAuth2.0有四种模式,分别是:Authorisation code grantImplicit grantResource owner credentials grantClient credentials grant。这里我就介绍微博使用的 Authorisation code grant 该模式,相信大家一通百通。

    选择后,首选要在 config/oauth2.php 中配置 grant_types 选项:

‘grant_types‘ => [
    ‘authorization_code‘ => [
        ‘class‘ => ‘\League\OAuth2\Server\Grant\AuthCodeGrant‘,
        ‘access_token_ttl‘ => 3600,
        ‘auth_token_ttl‘ => 3660
    ]
]

代码与数据库的处理

数据库初始化数据

在写代码之前,我们先来把数据库里边填入一些初始数据。

首先是增加一个用户,推荐大家使用 Laravel5 自带的 Seeder 来完成。我就不说过程了,直接告诉大家该初始化一些什么数据!

* 向 users table添加一个用户

* 向 oauth_clients table 添加一个client,需要注意的是它的id是字符串类型,相当于申请微博时分配的AppKey

* 向 oauth_scopes table添加两天记录,如下图:

* 向 oauth_client_scopes table中添加记录如下:

* 向 oauth_client_endpoints 添加记录如图:

ps:此处应该注意,redirect_uri 的值应该是填写你自己本地能够回调的地址,不要一味模仿,请根据自己的实际情况

至于添加这些数据到底是神马意思,相信根据表的命名可以猜出一二,是在不清楚的可以留言询问哈。

终于到了代码阶段

这里为了简便,我将所有代码按照github上提供的文档,卸载了路由文件中,建议项目中使用时,请将闭包中的代码移植到控制器中,否则你将无法使用laravel提供的路由缓存功能。

整个路由代码如下:

// 这是需要经过OAuth2.0授权后才能访问的资源,不信你直接访问绝对会报错
Route::get(‘/‘, [‘middleware‘ => [‘oauth‘], function () {
    return view(‘welcome‘);
}]);
// 登陆
Route::get(‘auth/login‘, function() {
    return view(‘auth.login‘);
});
Route::post(‘auth/login‘, function()
{
    if(Auth::attempt(Input::only(‘email‘, ‘password‘))){
        return Redirect::intended(‘oauth‘);
    }
});
// 这会让页面跳转到一个授权页面,提供给用户进行操作
Route::get(‘oauth/authorize‘, [‘as‘ => ‘oauth.authorize.get‘, ‘middleware‘ => [‘check-authorization-params‘, ‘auth‘], function(){
    // display a form where the user can authorize the client to access it‘s data
    $authParams = Authorizer::getAuthCodeRequestParams();
    $formParams = array_except($authParams,‘client‘);
    $formParams[‘client_id‘] = $authParams[‘client‘]->getId();
    return View::make(‘oauth.authorization-form‘, [‘params‘=>$formParams,‘client‘=>$authParams[‘client‘]]);
}]);
// 用户通过授权,客户端向认证服务器申请令牌的HTTP请求
Route::post(‘oauth/authorize‘, [‘as‘ => ‘oauth.authorize.post‘,‘middleware‘ => [‘csrf‘, ‘check-authorization-params‘, ‘auth‘], function() {

    $params = Authorizer::getAuthCodeRequestParams();
    $params[‘user_id‘] = Auth::user()->id;

    $redirectUri = ‘‘;

    // if the user has allowed the client to access its data, redirect back to the client with an auth code
    if (Input::get(‘approve‘) !== null) {
        $redirectUri = Authorizer::issueAuthCode(‘user‘, $params[‘user_id‘], $params);
    }

    // if the user has denied the client to access its data, redirect back to the client with an error message
    if (Input::get(‘deny‘) !== null) {
        $redirectUri = Authorizer::authCodeRequestDeniedRedirectUri();
    }

    return Redirect::to($redirectUri);
}]);
// 认证服务器发送的HTTP回复
Route::post(‘oauth/access_token‘, [‘as‘ => ‘access_token‘, function() {
    header(‘Content-Type:application/json; charset=utf-8‘);
    return Response::json(Authorizer::issueAccessToken());
}]);
// 用来客户端向认证服务器申请令牌的HTTP请求的页面,便于发送post请求
Route::get(‘/callback‘, function(){
    if(Input::has(‘code‘)){
        return view(‘callback‘);
    }
});

以上使用到的视图文件,请参考Laravle-OAuth2项目。

效果展示

这里页面效果的演示,我会按照OAuth2.0的执行过程来进行说明,先将 授权码模式 的执行流程帖在这里:

中文解释如下:

(A)用户访问客户端,后者将前者导向认证服务器。

(B)用户选择是否给予客户端授权。

(C)假设用户给予授权,认证服务器将用户导向客户端事先指定的”重定向URI”(redirection URI),同时附上一个授权码。

(D)客户端收到授权码,附上早先的”重定向URI”,向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。

(E)认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。

对应A步骤:

A步骤中,客户端申请认证的URI,包含以下参数:

redirect_uri:表示重定向URI,可选项

state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。

response_type:表示授权类型,必选项,此处的值固定为”code”

client_id:表示客户端的ID,必选项

scope:表示申请的权限范围,可选项

对应B步骤:

通过A步骤访问后,显示的页面就是把是否授权展现给了用户,用户可以进行选择,假设用户选择 Approve ,那么继续

对应C步骤:

这时候观察地址栏发现地址栏中显示的地址是我们的回调地址,以及携带了code及state的参数。观察控制台也会发现302的状态码。

对应D步骤:

本身来说这一步是不可见的,对于用户,但是为了演示,所以提供了这样一个post表单,正常项目中大家可以通过客户端后台向AS发送认证的post请求,此时AS会返回一个json数据,从中取出 access_token 后,附加在相关的资源URI后面,即可访问该资源了。

对应E步骤:

获取服务器返回数据

{
    "access_token":"Zv0anjwEjAm7SFZGjH1K3MRW6yNj56SuC5MGI9kB",
    "token_type":"Bearer",
    "expires_in":3600
}

OK,现在可以测试访问需要授权的资源了。针对于我们这里就是:

http://localhost/llaravel/public/ ,此时如果不添加参数,直接访问会看到以下报错信息:

{
    "error":"invalid_request",
    "error_description":"The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed. Check the \"access token\" parameter."
}

正确的访问姿势是:http://localhost/llaravel/public?access_token=Zv0anjwEjAm7SFZGjH1K3MRW6yNj56SuC5MGI9kB,此时访问,你就会看到Laravel5漂亮的首页界面了。

OK,到这里就讲完了!希望对你有帮助。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-18 07:38:36

8. Laravel5学习笔记:在laravel5中使用OAuth授权的相关文章

MVC4 学习笔记 之 URL中存在编译的空格 20%20%

/Config/Edit/QQCC%20%20%20%20%20%20%20 原因是: 通过EF直接添加了空格? NO 是因为你的数据库字段设计问题,因为你当然设计如>:sID nchar(10) 那你一定想输入10个字符,但实际你只输入了必个,所以后面数据自动帮你补空了. 从EF数据库取出数据,在绑定的时候为安全,编码了,所以显示%20,代表一个空格. MVC4 学习笔记 之 URL中存在编译的空格 20%20%,布布扣,bubuko.com

Guava学习笔记:guava中的Preconditions使用

Guava学习笔记:guava中的Preconditions使用 转载:http://outofmemory.cn/java/guava/base/Preconditions google guava的base包中提供的Preconditions类用来方便的做参数的校验,他主要提供如下方法: checkArgument 接受一个boolean类型的参数和一个可选的errorMsg参数,这个方法用来判断参数是否符合某种条件,符合什么条件google guava不关心,在不符合条件时会抛出Illeg

【学习笔记】jQuery中的动画与效果

1.基本效果 匹配元素从左上角开始变浓变大或缩小到左上角变淡变小 ①隐藏元素 除了可以设置匹配元素的display:none外,可以用以下函数 hide(speed,[callback])  返回值:jQuery  参数-speed:三种预订速度之一的字符串String(slow,normal,fast)或表示动画时长的毫秒数Number  callback:在完成动画时执行的函数,每个匹配元素执行一次 slow=600毫秒  normal=400毫秒  fast=200毫秒 以优雅的动画隐藏所

Guava学习笔记:guava中对字符串的操作

Guava学习笔记:guava中对字符串的操作 转载:http://outofmemory.cn/java/guava/base/Strings 在google guava中为字符串操作提供了很大的便利,有老牌的判断字符串是否为空字符串或者为null,用指定字符填充字符串,以及拆分合并字符串,字符串匹配的判断等等. 下面我们逐一了解这些操作: 1. 使用com.google.common.base.Strings类的isNullOrEmpty(input)方法判断字符串是否为空        

Linux学习笔记——vmware plarer中安装ubuntu

1.前言 学习了很长时间ubuntu,在旧笔记中安装过lubuntu,也使用过他人安装好的ubuntu虚拟机(contiki2.6和contiki2.7).熟悉了ubuntu之后,决定自己尝试通过vmware player安装ubuntu. [1]vmware plaryer是免费软件,不存在破解问题.如果用来学习ubuntu完全足够了. [2]建议在虚拟机种学习ubuntu,等完全熟练之后再摆脱windows.ubuntu现在还没有有道笔记,QQ等工具,总感觉网上世界少了点什么. [3]在虚拟

cocos2dx学习笔记(4)——VS2010中的中文乱码问题

当你想使用中文时,你是否有这样的一个困惑. 把样例中的HelloWorld改成中文的 "你好,世界!". 然后编译运行,发现居然是个乱码!!! 因为cocos2dx中使用的是UTF-8字符集,而VS中确实ANSI. 所以我们需要对其进行字符集转换. 然后纵里寻它求百度,终于找到了解决方案. 一个函数搞定! #include "cocos2d.h" char* toUTF(const char* strGB2312) { int iLen = MultiByteToW

MySQL学习笔记-操作数据表中的记录

MySQL学习笔记-操作数据表中的记录 1.插入记录 INSERT INSERT [INTO] tbl_name [(col_name,...)] {VAULES|VALUE} ({expr|DEFAULT},...),(...),... 例,插入单条记录: mysql> USE testDatabase changed mysql> CREATE TABLE users(    -> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,   

【JS学习笔记】js中关于传地址的问题

我觉得初学者应该会遇到很多这样的问题 条件1.不想定义全局变量的时候 条件2.定义了外围变量却又要引用并且修改其中内容的时候 以下转一篇文章 -------------------------------------------------------------------------------------------------------------------------------------------------------- 很多人,包括我,受书本知识消化不彻底的影响,认为 J

[学习笔记]面向对象开发中的一些思想和原则

摘自<Java与模式>作者阎宏 面向对象的可复用设计的第一块基石:开闭原则(一个软件实体应当对扩展开放,对修改关闭) "开-闭"原则的手段和工具: 1)里氏代换原则:任何基类出现的地方,子类一定可以出现: 2)依赖倒转原则:要依赖于抽象,不要依赖于实现: 3)合成\聚合复用原则:要尽量使用合成\聚合,而不是继承关系达到复用的目的: 4)迪米特法则:一个软件实体应该与尽可能少的其它实体发生相互作用: 5)接口隔离原则:应当为客户端提供尽可能小的单独的接口,而不要提供大的总接口

Asp.Net Identity学习笔记+MVC5默认项目解析_授权&Claim

Identity学习笔记 Asp.Net Identity学习笔记+MVC5默认项目解析_基础用法 Asp.Net Identity学习笔记+MVC5默认项目解析_授权&Claim Identity学习笔记授权以角色授权IdentityRoleRoleManager基于声明的(Claims)IPrincipalIIdentityCalimsIdentityClaim用户登入用户授权其他细节Claim Type命名空间 授权 最常用的授权就是给Controller或Action打上[Authori