oAuth2.0在laravel5.2中的简单应用
oAuth是一个关于授权的开放网络标准,目前的版本是2.0。laravel是php开发框架,目前最新稳定版本是5.5。授权在应用程序中有非常广泛的使用场景,本文将以laravel5.2为例来简单介绍oAuth2.0具体应用方案。
构建和配置项目
安装
laravel5.2composer create-project laravel/laravel blog 5.2.*
没有composer的同学需要先进行安装,具体可参考ubuntu16.04安装composer一文。修改
composer.json在require中添加"lucadegasperi/oauth2-server-laravel": "5.1.*"
composer.json中的require执行
composer update完成lucadegasperi/oauth2-server-laravel的安装修改
config/app.php
在aliases中添加'Authorizer' => LucaDegasperi\OAuth2Server\Facades\Authorizer::class,
在providers中添加如下内容:
LucaDegasperi\OAuth2Server\Storage\FluentStorageServiceProvider::class,
LucaDegasperi\OAuth2Server\OAuth2ServerServiceProvider::class,
- 修改
app/Http/Kernel.php
在$middlewareGroups['web']中添加\LucaDegasperi\OAuth2Server\Middleware\OAuthExceptionHandlerMiddleware::class,并去掉\App\Http\Middleware\VerifyCsrfToken::class,
在$routeMiddleware中添加如下内容:
'oauth' => \LucaDegasperi\OAuth2Server\Middleware\OAuthMiddleware::class,
'oauth-user' => \LucaDegasperi\OAuth2Server\Middleware\OAuthUserOwnerMiddleware::class,
'oauth-client' => \LucaDegasperi\OAuth2Server\Middleware\OAuthClientOwnerMiddleware::class,
'check-authorization-params' => \LucaDegasperi\OAuth2Server\Middleware\CheckAuthCodeRequestMiddleware::class,
'csrf' => App\Http\Middleware\VerifyCsrfToken::class,
执行
php artisan vendor:publish
这将生成config/oauth2.php和数据库迁移所需的文件配置
.env中数据库的连接信息并执行php artisan migrate
将得到以下数据表:
oauth数据表配置
config/oauth2.php的grant_types元素如下
'password' => [
'class' => '\League\OAuth2\Server\Grant\PasswordGrant',
'callback' => '\App\Http\Controllers\Auth\PasswordGrantVerifier@verify',
'access_token_ttl' => 3600
]
- 创建
\App\Http\Controllers\Auth\PasswordGrantVerifier.php并填充内容如下
<?php
namespace App\Http\Controllers\Auth;
use Illuminate\Support\Facades\Auth;
class PasswordGrantVerifier
{
public function verify($username, $password)
{
$credentials = [
'email' => $username,
'password' => $password,
];
if (Auth::once($credentials)) {
return Auth::user()->id;
}
return false;
}
}
- 在
app\Http\routes.php中添加如下路由
Route::post('oauth/access_token', function() {
return Response::json(Authorizer::issueAccessToken());
});
获取授权
添加一个客户端
数据表oauth_clients用于存储客户端信息,可通过语句INSERT INTOoauth_clients(id,secret,name,created_at) VALUES('shy7jf8fa93d59c45502c0ae8chj76s', 'bc7f6f8fa93d59c45502c0ae8c4a95d', '点餐系统', CURRENT_TIMESTAMP)来添加一个客户端。
添加一个客户端添加一个用户
执行php artisan make:auth后访问http://localhost:8000/register注册一个用户。
register
一个用户测试授权服务
测试代码和结果如下:
function post($url, $param){
$oCurl = curl_init();
$aPOST = [];
foreach($param as $key=>$val){
$aPOST[] = $key.'='.urlencode($val);
}
$strPOST = join('&', $aPOST);
curl_setopt($oCurl, CURLOPT_URL, $url);
curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($oCurl, CURLOPT_POST,true);
curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST);
$sContent = curl_exec($oCurl);
$aStatus = curl_getinfo($oCurl);
curl_close($oCurl);
if(200 == intval($aStatus['http_code'])){
return $sContent;
}else{
return false;
}
}
$server = 'http://localhost:8000/oauth/access_token';
$params = [
'grant_type' => 'password',
'username' => 'admin@admin.com',
'password' => '123456',
'client_id' => 'shy7jf8fa93d59c45502c0ae8chj76s',
'client_secret' => 'bc7f6f8fa93d59c45502c0ae8c4a95d',
];
echo post($server, $params);


授权验证
- 创建一个获取用户列表的接口
// app/Http/routes.php中增加路由
Route::group(['prefix'=>'api', 'middleware' => 'oauth'], function () { // 加上'middleware' => 'oauth'将会进行oAuth2.0验证
Route::get('/user', 'Api\UserController@index');
});
<?php
// App\Http\Controllers\Api\UserController.php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\User;
use Response;
class UserController extends Controller
{
public function index()
{
return Response::json(User::all());
}
}
访问用户列表接口
不带access_token访问
带不正确或过期的access_token访问
带正确的access_token访问获取授权用户信息
需要修改app/Http/routes.php和App\Http\Controllers\Api\UserController.php,具体修改内容如下:
// 在用户路由组中增加Route::get('/user/show', 'Api\UserController@show');
Route::group(['prefix'=>'api', 'middleware' => 'oauth'], function () { // 加上'middleware' => 'oauth'将会进行oAuth2.0验证
Route::get('/user', 'Api\UserController@index');
Route::get('/user/info', 'Api\UserController@info');
});
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\User;
use Response;
use LucaDegasperi\OAuth2Server\Authorizer;
class UserController extends Controller
{
public function index()
{
return Response::json(User::all());
}
public function info(Authorizer $authorizer)
{
$user_id = $authorizer->getResourceOwnerId();
return Response::json(User::find($user_id));
}
}

本文首发于公众号:programmer_cc,转载请注明出处。
oAuth2.0在laravel5.2中的简单应用的更多相关文章
- Dingo Api 1.0在laravel5.2中的简单应用
Dingo Api是为基于laravel的开发提供了一系列工具集,这些工具集可以帮助开发者快速构建API.Dingo Api最新的版本是2.0.0-alpha1,这个版本需要php7.0以上的php版 ...
- 一张图搞定OAuth2.0 在Office应用中打开WPF窗体并且让子窗体显示在Office应用上 彻底关闭Excle进程的几个方法 (七)Net Core项目使用Controller之二
一张图搞定OAuth2.0 目录 1.引言 2.OAuth2.0是什么 3.OAuth2.0怎么写 回到顶部 1.引言 本篇文章是介绍OAuth2.0中最经典最常用的一种授权模式:授权码模式 非常 ...
- 简单搞懂OAuth2.0
本文转自:https://www.cnblogs.com/flashsun/p/7424071.html 原作者:闪客sun 一张图搞定OAuth2.0 目录 1.引言 2.OAuth2.0是什么 3 ...
- NET仿微信Oauth2.0
这个文章先说一说Oauth2.0的原理,再到应用场景,最后才是代码实现,这样才学会最终的思想,并在应用场景使用,所谓实践出真理. 1,Oauth2.0的原理 OAuth是一个关于授权(authoriz ...
- 秒懂OAuth2.0
1.引言 本篇文章是介绍OAuth2.0中最经典最常用的一种授权模式:授权码模式 非常简单的一件事情,网上一堆神乎其神的讲解,让我不得不写一篇文章来终结它们. 一项新的技术,无非就是了解它是什么,为什 ...
- 理解OAuth2.0认证
一.什么是OAuth协议 OAuth 协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是 OAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方 ...
- 一张图搞定OAuth2.0
1.引言 本篇文章是介绍OAuth2.0中最经典最常用的一种授权模式:授权码模式 非常简单的一件事情,网上一堆神乎其神的讲解,让我不得不写一篇文章来终结它们. 一项新的技术,无非就是了解它是什么,为什 ...
- OAuth2.0 授权许可 之 Authorization Code
写在前面: 在前一篇博客<OAuth2.0 原理简介>中我们已经了解了OAuth2.0的原理以及它是如何工作的,那么本篇我们将来聊一聊OAuth的一种授权许可方式:授权码(Authoriz ...
- 整合spring cloud云架构 - SSO单点登录之OAuth2.0登录认证(1)
之前写了很多关于spring cloud的文章,今天我们对OAuth2.0的整合方式做一下笔记,首先我从网上找了一些关于OAuth2.0的一些基础知识点,帮助大家回顾一下知识点: 一.oauth中的角 ...
随机推荐
- 定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Complex(int i,int j) 显示复数的方法:showComp()将其显示为如: 5+8i或5-8i 的形式。 求两个复数的和的方法:(参数是两个复数类对象,返回值是复数类对象)public Complex addComp(Compl
因标题框有限,题目未显示完整,以下再放一份: 定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Compl ...
- P1569 [USACO11FEB]属牛的抗议
题目描述 Farmer John's N (1 <= N <= 100,000) cows are lined up in a row and numbered 1..N. The cow ...
- 通过ReentrantLock简单了解下并发包中的锁
ReentrantLock在进行实例化时,可以通过构造函数的参数选择是否使用公平锁FairSync或者非公平锁NonfairSync,两者的区别比较简单,如果是公平锁则新来的线程会先检测同步队列中是否 ...
- EasyX_无法填充圆颜色的问题
官网:https://www.easyx.cn/ 在线帮助文档:https://docs.easyx.cn/ 目标:生成一个边框为黄色,填充为蓝色的圆 遇到的问题:使用以下代码,只能生成边框为黄色的圆 ...
- Linux基础命令之文件和目录操作(二)
. find 用于查找目录下的文件,也可以调用其他命令使用 find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression] fi ...
- Redis全方位详解--数据类型使用场景和redis分布式锁的正确姿势
一.Redis数据类型 1.string string是Redis的最基本数据类型,一个key对应一个value,每个value最大可存储512M.string一半用来存图片或者序列化的数据. 2.h ...
- STM32单片机复位后GPIO电平状态
stm32单片机gpio共有八种工作模式,如下图: stm32单片机是一个低功耗的处理器,当复位以后,gpio默认是高阻状态,也就是浮空输入.这样的好处是: 1.降低了单片机的功耗 2.把gpio模式 ...
- window下查杀占用端口的进程
一. 查找占用的端口进程号,比如8080 C:> netstat –ano|findstr 8080 C:\Users\chry>netstat -ano | findstr 8080 T ...
- P3164 [CQOI2014]和谐矩阵
P3164 [CQOI2014]和谐矩阵 乱写能AC,暴力踩标程(雾 第一眼 诶这题能暴力枚举2333!!! 第二眼 诶这题能高斯消元!那只需要把每个位置的数给设出来就能够列方程了!然后就可以\(O( ...
- JavaScript——引用类型之数组
前言 之前本菜打算在写完基本类型后写引用类型Object的,因为Object是引用类型的基础,其他的引用类型也是以Object为根本.只是关于对象的基本认识与简单操作确实可写的不多,打算之后与原型.原 ...