oAuth是一个关于授权的开放网络标准,目前的版本是2.0laravelphp开发框架,目前最新稳定版本是5.5。授权在应用程序中有非常广泛的使用场景,本文将以laravel5.2为例来简单介绍oAuth2.0具体应用方案。

构建和配置项目

  • 安装laravel5.2
    composer 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.phpgrant_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);
 
测试结果
 
表oauth_access_tokens中数据

授权验证

  • 创建一个获取用户列表的接口
// 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.phpApp\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中的简单应用的更多相关文章

  1. Dingo Api 1.0在laravel5.2中的简单应用

    Dingo Api是为基于laravel的开发提供了一系列工具集,这些工具集可以帮助开发者快速构建API.Dingo Api最新的版本是2.0.0-alpha1,这个版本需要php7.0以上的php版 ...

  2. 一张图搞定OAuth2.0 在Office应用中打开WPF窗体并且让子窗体显示在Office应用上 彻底关闭Excle进程的几个方法 (七)Net Core项目使用Controller之二

    一张图搞定OAuth2.0   目录 1.引言 2.OAuth2.0是什么 3.OAuth2.0怎么写 回到顶部 1.引言 本篇文章是介绍OAuth2.0中最经典最常用的一种授权模式:授权码模式 非常 ...

  3. 简单搞懂OAuth2.0

    本文转自:https://www.cnblogs.com/flashsun/p/7424071.html 原作者:闪客sun 一张图搞定OAuth2.0 目录 1.引言 2.OAuth2.0是什么 3 ...

  4. NET仿微信Oauth2.0

    这个文章先说一说Oauth2.0的原理,再到应用场景,最后才是代码实现,这样才学会最终的思想,并在应用场景使用,所谓实践出真理. 1,Oauth2.0的原理 OAuth是一个关于授权(authoriz ...

  5. 秒懂OAuth2.0

    1.引言 本篇文章是介绍OAuth2.0中最经典最常用的一种授权模式:授权码模式 非常简单的一件事情,网上一堆神乎其神的讲解,让我不得不写一篇文章来终结它们. 一项新的技术,无非就是了解它是什么,为什 ...

  6. 理解OAuth2.0认证

    一.什么是OAuth协议 OAuth 协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是 OAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方 ...

  7. 一张图搞定OAuth2.0

    1.引言 本篇文章是介绍OAuth2.0中最经典最常用的一种授权模式:授权码模式 非常简单的一件事情,网上一堆神乎其神的讲解,让我不得不写一篇文章来终结它们. 一项新的技术,无非就是了解它是什么,为什 ...

  8. OAuth2.0 授权许可 之 Authorization Code

    写在前面: 在前一篇博客<OAuth2.0 原理简介>中我们已经了解了OAuth2.0的原理以及它是如何工作的,那么本篇我们将来聊一聊OAuth的一种授权许可方式:授权码(Authoriz ...

  9. 整合spring cloud云架构 - SSO单点登录之OAuth2.0登录认证(1)

    之前写了很多关于spring cloud的文章,今天我们对OAuth2.0的整合方式做一下笔记,首先我从网上找了一些关于OAuth2.0的一些基础知识点,帮助大家回顾一下知识点: 一.oauth中的角 ...

随机推荐

  1. python基础整理1

    基础知识 名字与对象,类与类型 变量:在Python中,存储一个数据,需要一个叫做变量的东西   num2 = 87 #num2是一个变量 变量的类型: 程序中为了更充分的利用内存空间以及更有效率的管 ...

  2. NYOJ 44 字串和 (最大字串和 线性dp)

    题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=44 子串和 时间限制:5000 ms  |  内存限制:65535 KB 难度:3 ...

  3. Putty等工具中解决SSH连接超时断开的问题

    转自:http://www.putty.ws/putty-chaoshi 1 在 linux下的ssh命令:vim /etc/ssh/ssh_config 然后找到里面的ServerAliveInte ...

  4. 一个考验c语言和数据结构功底的小项目

    想测一下自己c语言学习水平的朋友可以做一下这个项目试试,能做出来说明c语言已经入门了   #include<stdio.h> #include<stdlib.h> #inclu ...

  5. 在windows上安装不同(两个)版本的Mysql数据库

    1.起因: 需要导入一个sql文件,发现死活导不进去.当执行到这一句时,就有问题.经过一番搜索,原来是我的数据库版本(原先Mysql版本5.5)低了,而支持该语句的版本应该是至少要5.7.那我索性就去 ...

  6. 2017-2018-1 20155317 IPC

    2017-2018-1 20155317 IPC - 共享内存 共享内存主要是通过映射机制实现的.以window系统调用为例子:Windows 下进程的地址空间在逻辑上是相互隔离的,但在物理上却是重叠 ...

  7. PyQt5 笔记(03):弹出窗口大全

    本文实现了PyQt5个各种弹出窗口:输入框.消息框.文件对话框.颜色对话框.字体对话框.自定义对话框 其中,为了实现自定义对话框的返回值,使用了信号/槽 本文基于 windows 7 + python ...

  8. 03 - django简介

    1.MVC与MTV模型 2.Django的下载与基本命令 pip install django==2.0.1 第三方库安装到哪里了? 创建一个django project C:\Desktop\fir ...

  9. 4820: [Sdoi2017]硬币游戏

    4820: [Sdoi2017]硬币游戏 链接 分析: 期望dp+高斯消元. 首先可以建出AC自动机,Xi表示经过节点i的期望次数,然后高斯消元,这样点的个数太多,复杂度太大.但是AC自动机上末尾节点 ...

  10. Codeforces 911D. Inversion Counting (数学、思维)

    题目链接:Inversion Counting 题意: 定义数列{ai|i=1,2,...,n}的逆序对如下:对于所有的1≤j<i≤n,若ai<aj,则<i,j>为一个逆序对. ...