Laravel Api认证包passport的简单使用

官方文档:https://docs.golaravel.com/docs/5.5/passport/

Laravel使用Laravel Passport轻松实现API身份验证,Laravel Passport在几分钟内就可以为Laravel应用程序提供完整的OAuth2服务器实现

composer安装

composer require laravel/passport

不过很多时候因为php版本的原因无法安装,就需要在composer.json--require中添加

"laravel/passport": "4.0.3"

然后

composer update

接下来,将 Passport 的服务提供者注册到配置文件 config/app.php 的 providers 数组中:

Laravel\Passport\PassportServiceProvider::class,

在mysql中创建存储客户端和访问令牌所需的table

php artisan migrate

创建生成安全访问令牌时所需的加密密钥,和用于生成访问令牌的「个人访问」客户端和「密码授权」客户端:

php artisan passport:install

建议将生成的令牌令牌写入.env中,如下

CLIENT_ID=1
CLIENT_SECRET=oSXGS6cu7xAB6gIF05p57itujd2ieyRPatZOsbJl

PASSPORT_CLIENT_ID=2
PASSPORT_CLIENT_SECRET=wYFO2jTAu5IcOHS0pbYTiLrM0M1XmWAPUDYXnOhr

Laravel\Passport\HasApiTokens 引入HasApiTokens,用于检查已认证用户的令牌和使用范围

<?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 Laravel\Passport\Passport;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * 应用程序的策略映射。
     *
     * @var array
     */
    protected $policies = [
        'App\Model' => 'App\Policies\ModelPolicy',
    ];

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

        Passport::routes();
    }
}

最后,将配置文件 config/auth.php 中授权看守器 guardsapidriver 选项改为 passport。此调整会让你的应用程序在在验证传入的 API 的请求时使用 Passport 的 TokenGuard 来处理:

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

    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

默认情况下,Passport 发放的访问令牌是永久有效的,不需要刷新。在 AuthServiceProviderboot 方法中配置有效期

use Carbon\Carbon;

/**
 * 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));
}

开始使用

登录后台代码,这里使用了guzzlehttp/guzzleHTTP客户端包

composer require guzzlehttp/guzzle
public function login(){
        $email=\request('email');
        $password =\request('password');
        if (auth()->attempt(['email'=>$email,'password'=>$password])){
            $user = User::where('email',$email)->first();
            $name = is_null($user) ? '' : $user->name;
            return $this->proxy('password',$name,[
                'username'=> $email,
                'password'=> $password,
                'scope'=> '',
            ]);
        }
        return response()->json([
            'code'=> 501,
            'message'=>'账号密码错误'
        ]);
    }
public function proxy($grantType, $name, array $data = []){
        $data = array_merge($data,[
            'client_id' => env('PASSPORT_CLIENT_ID'),
            'client_secret' => env('PASSPORT_CLIENT_SECRET'),
            'grant_type'=>$grantType
        ]);

        $url = 'http://'.$_SERVER["HTTP_HOST"].'/oauth/token';

        $http = new GuzzleHttp\Client();
        $http->request('POST',$url,[
            'verify' => false,
            'form_params' => $data
        ]);
        $token = json_decode(( string) $response->getBody(),true);

        return response()->json([
            'code' => 1,
            'data' => [
                'token' => $token['access_token'],
                'expires_in' => $token['expires_in'],
                'user'=>$name
            ]
        ])->cookie('refreshToken',$token['refresh_token'],14000,null,null,false,true);
   }

登录成功会返回token,expires_in,user以及存入cookie中的refreshToken

当调用 Passport 保护下的路由时,接入的 API 应用需要将访问令牌作为 Bearer 令牌放在请求头 Authorization 中。例如

$response = $client->request('GET', '/api/user', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.$accessToken,
    ],
]);

api.php

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

推荐阅读更多精彩内容