(jwt+dingo)和(passport+dingo)使用

Laravel实现dingo+JWT api接口之配置篇
Laravel实现dingo+JWT api接口之实战篇

  1. 安装dingo

  2. 你需要修改你的 composer.json 文件,然后执行 composer update 把最后一个版本的包加入你的项目
"require": {
    "dingo/api": "1.0.*@dev"
}

或者直接

composer require dingo/api:1.0.x@dev
  • 打开 config/app.php,注册必要的 service provider 在你的应用 providers 之前。
'providers' => [
    Dingo\Api\Provider\LaravelServiceProvider::class
]
  • 生成dingo配置文件 config/api.php :
php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"
  • .env添加基础配置(四个即可):
#标准树
API_STANDARDS_TREE=vnd
#前缀
API_PREFIX=api
#版本
API_VERSION=v1
#开启调试
API_DEBUG=true
phpAPI_STANDARDS_TREE=vnd
API_SUBTYPE=biubiujun
API_PREFIX=api
API_VERSION=v1
API_NAME=BiuBiuJun
API_CONDITIONAL_REQUEST=false
API_STRICT=false
API_DEFAULT_FORMAT=json
API_DEBUG=true
API_STANDARDS_TREE - API规格 
  1 本地或私有环境 
  2 prs 非商业销售的项目 
  3 vnd 公开的以及商业销售的项目
API_SUBTYPE - API简称 
API_PREFIX - API前缀(或使用API_DOMAIN - API子域名) 
API_VERSION - API默认版本 
API_NAME - API名称 
API_CONDITIONAL_REQUEST - 带条件的请求,由于缓存API请求的时候会使用客户端缓存功能,所以默认开启了带条件的请求 
API_STRICT - 严格模式,要求客户端发送Accept头而不是默认在配置文件中指定的版本 
API_DEFAULT_FORMAT - 响应格式,默认的响应格式是JSON 
API_DEBUG - 调试模式
  1. 你需要修改你的 composer.json 文件,然后执行 composer update 把最后一个版本的包加入你的项目
"require": {
    "tymon/jwt-auth": "0.5.*"
}

或者直接

composer require tymon/jwt-auth
  • 打开 config/app.php,注册到 providers 数组。
'providers'=>[
Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class,
]
  • 注册jwt门面:
'aliases'=>[
'JWTAuth'=> Tymon\JWTAuth\Facades\JWTAuth::class,
'JWTFactory'=> Tymon\JWTAuth\Facades\JWTFactory::class,
]
  • 生成jwt配置文件 config/jwt.php :
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"
  • 生成 jwt.php 文件中数组的 secret 键成对应的值:
php artisan jwt:generate
  • 关联dingo与JWT

修改 config/api.phpauth 如下:

'auth' => [  
    'basic' => function($app){  
        return new Dingo\Api\Auth\Provider\Basic($app['auth']);  
    },  
    'jwt' => function($app){  
        return new Dingo\Api\Auth\Provider\JWT($app['Tymon\JWTAuth\JWTAuth']);  
    }  
],  
  • 安装passport

    1. 使用 Composer 依赖包管理器安装 Passport :
composer require laravel/passport
  • 接下来,将 Passport 的服务提供者注册到配置文件 config/app.phpproviders 数组中:
    Laravel\Passport\PassportServiceProvider::class,
    Passport 使用服务提供者注册内部的数据库迁移脚本目录,所以上一步完成后,你需要更新你的数据库结构。Passport 的迁移脚本会自动创建应用程序需要的客户端数据表和令牌数据表:
  • php artisan migrate
    添加了如下几张表:
Migrating: 2016_06_01_000001_create_oauth_auth_codes_table
Migrating: 2016_06_01_000002_create_oauth_access_tokens_table
Migrating: 2016_06_01_000003_create_oauth_refresh_tokens_table
Migrating: 2016_06_01_000004_create_oauth_clients_table
Migrating: 2016_06_01_000005_create_oauth_personal_access_clients_table

如果你不打算使用 Passport 的默认迁移,你应该在 AppServiceProviderregister 方法中调用 Passport :: ignoreMigrations 方法。 你可以导出这个默认迁移用 php artisan vendor:publish --tag=passport-migrations 命令。

  1. 接下来,你需要运行 passport:install 命令来创建生成安全访问令牌时用到的加密密钥,同时,这条命令也会创建「私人访问」客户端「密码授权」客户端:【运行 passport:install 命令,该命令将会创建生成安全访问令牌(token)所需的加密键,此外,该命令还会创建 personal accesspassword grant 客户端用于生成访问令牌,该命令会在 storage 目录中生成认证需要的加密键, oauth-private.keyoauth-public.key
    php artisan passport:install
    执行上述代码后的结果:
Encryption keys generated successfully.
Personal access client created successfully.
Client ID: 1
Client Secret: e7pPOyPMFiEuE5EvtDvY9qsesfTgqNhb61r37cez
Password grant client created successfully.
Client ID: 2
Client Secret: eI4XKieiDQRUCMpnfb3g5MOr8SItQ5rCZBv3bWO3
  • 上面命令执行后,请将 Laravel\Passport\HasApiTokens Trait 添加到 App\User 模型中,这个 Trait 会给你的模型提供一些辅助函数,用于检查已认证用户的令牌和使用作用域:
<?php
namespace App;
use Laravel\Passport\HasApiTokens;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
    use HasApiTokens, Notifiable;
}
  • 接下来,需要在 AuthServiceProviderboot 方法中调用 Passport::routes 函数。这个函数会注册一些在访问令牌、客户端、私人访问令牌的发放和吊销过程中会用到的必要路由:
<?php
namespace App\Providers;
use Carbon\Carbon;
use Laravel\Passport\Passport;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        'App\Model' => 'App\Policies\ModelPolicy',
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        Passport::routes();

        Passport::tokensExpireIn(Carbon::now()->addDays(15));

        Passport::refreshTokensExpireIn(Carbon::now()->addDays(30));

        Passport::pruneRevokedTokens();
    }
}

最后,需要将配置文件 config/auth.phpapi 部分的授权保护项( driver )改为 passport 。此调整会让你的应用程序在接收到 API 的授权请求时使用 Passport 的 TokenGuard 来处理:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'passport',
        'provider' => 'users',//【可能这里需要修改】
    ],
],
  • 如果用手机号进行授权的话,需要修改模型
    /**
     * [findForPassport passport通过手机号/账号验证]
     * @param  [type] $username [description]
     * @return [type]           [description]
     */
    public function findForPassport($username)
    {
        // if (!$this->where('phone', $username)->first()) {
        //     return $this->where('name', $username)->first();
        // }
        // return true;

        return $this->where('phone', $username)->first();

        // return $this->where('phone', $username)->first() || $this->where('name', $username)->first();
    }
php artisan passport:client --password

配置Dingo使用Passport密码发放令牌

  • 创建 PassportDingoProvider
php artisan make:provider PassportDingoProvider
  • 修改 app/Providers/PassportDingoProvider.php
<?php
namespace App\Providers;
use Dingo\Api\Routing\Route;
use Illuminate\Http\Request;
use Dingo\Api\Auth\Provider\Authorization;
class PassportDingoProvider extends Authorization
{
    public function authenticate(Request $request, Route $route)
    {
        return $request->user();
    }
    public function getAuthorizationMethod()
    {
        return 'bearer';
    }
}
  • 修改 config/api.php
'auth' => [ 
    'custom' => \App\Providers\PassportDingoProvider::class
],
  • 修改 App/Http/Kernel.php
protected $middlewareGroups = [
   ...
   'api:auth' => [
       'auth:api',
       'api.auth'
    ]
    ...
];
  • routes/api.php 修改之前注册路由
$api = app('Dingo\Api\Routing\Router');
$api->version('v1', ['middleware' => 'api:auth', 'namespace' => 'App\Http\Controllers\Api\V1'], function ($api) {
    $api->get('user/{id}', 'UserController@show');
    $api->get('user', 'UserController@index');
});
  • 测试-请求令牌
    curl -d "username=biubiujun@163.com@password=123456@grant_type=password&client_id=<client_id>&client_secret=<client_secret>" http://localhost/path/public/api/oauth/token
  • 测试-请求用户列表
curl -H "Authorization: Bearer <token>" http://localhost/path/public/api/user
composer require zircote/swagger-php
  • 创建 SwaggerController
php artisan make:controller SwaggerController
  • 修改 app/Http/Controller/SwaggerController
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
class SwaggerController extends Controller
{
    public function doc()
    {
        $swagger = \Swagger\scan(__DIR__ . '/../');
        return response()->json($swagger);
    }
}
  • 下载 swagger-ui
    swagger-ui
    • 将swagger-ui/dist目录放入public/doc
    • 修改public/doc/index.html
<script src='lang/translator.js' type='text/javascript'></script>
<script src='lang/zh-cn.js' type='text/javascript'></script>
<script type="text/javascript">
    $(function () {
      var url = window.location.search.match(/url=([^&]+)/);
        if (url && url.length > 1) {
          url = decodeURIComponent(url[1]);
        } else {
          // url = "http://petstore.swagger.io/v2/swagger.json"
          url = "/api/doc";
        }

访问http://localhost/path/public/doc/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,829评论 1 331
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,603评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,846评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,600评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,780评论 3 272
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,695评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,136评论 2 293
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,862评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,453评论 0 229
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,942评论 2 233
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,347评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,790评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,293评论 3 221
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,839评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,448评论 0 181
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,564评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,623评论 2 249

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,050评论 18 139
  • 前言 也可以关注我的个人博客  这里摘录下laravel5.5教程的认证文档,做个总结,方便今后查阅。 安装pas...
    小峰书阅读 2,054评论 0 1
  • 是什么 如果你知道yum、apt-get、npm、bower等命令中的一种或者多种,那么,你也能很快知道compo...
    旱魃一样阅读 3,067评论 0 9
  • Composer Repositories Composer源 Firegento - Magento模块Comp...
    零一间阅读 3,936评论 1 66
  • 我是易效能G130的学员袁斌,现在是G153: 2班5组的复训生。 我的三个标签: 1、我是一个25岁小孩的妈妈 ...
    自由飞翔呀阅读 373评论 0 0