Laravel5.4 Oauth2.0認(rèn)證應(yīng)用 API 實戰(zhàn)!

項目初始化

新建項目

lukeyans-MacBook-Pro:laravel lukeyan$ laravel new laravel_demo

添加laravel自帶的Passport服務(wù)

lukeyans-MacBook-Pro:laravel_demo lukeyan$ composer require laravel/passport

接下來,將 Passport 的服務(wù)提供者注冊到配置文件 config/app.php 的 providers 數(shù)組中:

Laravel\Passport\PassportServiceProvider::class,

在.env 文件配置好數(shù)據(jù)鏈接鬼吵,因為我本地的數(shù)據(jù)庫版本是

服務(wù)器: Localhost via UNIX socket
服務(wù)器類型: MariaDB
服務(wù)器版本: 10.1.16-MariaDB - Source distribution

laravel 5.4 改變了默認(rèn)的數(shù)據(jù)庫字符集,現(xiàn)在utf8mb4包括存儲emojis支持篮赢。
而我的版本比較低一點(高于 10.2.2 版本的不需要理會)齿椅,不支持,得修改一下字符串的長度启泣。

修改

在 AppServiceProvider.php 文件里的 boot 方法里設(shè)置一個默認(rèn)值

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;   //新增的

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Schema::defaultStringLength(191);  //新增的
    }
}

Passport 使用服務(wù)提供者注冊內(nèi)部的數(shù)據(jù)庫遷移腳本目錄加派,所以上一步完成后悔常,你需要更新你的數(shù)據(jù)庫結(jié)構(gòu)。Passport 的遷移腳本會自動創(chuàng)建應(yīng)用程序需要的客戶端數(shù)據(jù)表和令牌數(shù)據(jù)表:

php artisan make:auth //先生成基礎(chǔ)的用戶數(shù)據(jù)庫表
php artisan migrate //再更新

接下來,你需要運行 passport:install 命令來創(chuàng)建生成安全訪問令牌時用到的加密密鑰票腰,同時闻蛀,這條命令也會創(chuàng)建「私人訪問」客戶端和「密碼授權(quán)」客戶端:

php artisan passport:install

上面命令執(zhí)行后,請將 Laravel\Passport\HasApiTokens Trait 添加到 App\User 模型中,這個 Trait 會給你的模型提供一些輔助函數(shù)险耀,用于檢查已認(rèn)證用戶的令牌和使用作用域:

<?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;
}

接下來,需要在 AuthServiceProvider 的 boot 方法中調(diào)用 Passport::routes 函數(shù)玖喘。這個函數(shù)會注冊一些在訪問令牌甩牺、客戶端、私人訪問令牌的發(fā)放和吊銷過程中會用到的必要路由:

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

最后芒涡,需要將配置文件 config/auth.php 中 api 部分的授權(quán)保護項( driver )改為 passport 柴灯。此調(diào)整會讓你的應(yīng)用程序在接收到 API 的授權(quán)請求時使用 Passport 的 TokenGuard 來處理:

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

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

接下來,增加API的路由费尽,好實現(xiàn)用戶的

  1. 新增
  2. 登錄
  3. 查看詳情的功能
    打開 routes/api.php 文件添加
<?php

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

Route::post('login', 'API\UserController@login');
Route::post('register', 'API\UserController@register');

Route::group(['middleware' => 'auth:api'], function(){
    Route::post('details', 'API\UserController@details');
});

接著增加控制器赠群,在APP/HTTP/Controller 目錄新增一個專門的API文件夾放

lukeyans-MacBook-Pro:laravel_demo lukeyan$ php artisan make:controller Api/UserController

增加對應(yīng)路由指向的api的方法

<?php

namespace App\Http\Controllers\API;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\User;
use Illuminate\Support\Facades\Auth;
use Validator;

class UserController extends Controller
{

    public $successStatus = 200;

    /**
     * login api
     *
     * @return \Illuminate\Http\Response
     */
    public function login(){
        if(Auth::attempt(['email' => request('email'), 'password' => request('password')])){
            $user = Auth::user();
            $success['token'] =  $user->createToken('MyApp')->accessToken;
            return response()->json(['success' => $success], $this->successStatus);
        }
        else{
            return response()->json(['error'=>'Unauthorised'], 401);
        }
    }

    /**
     * Register api
     *
     * @return \Illuminate\Http\Response
     */
    public function register(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'name' => 'required',
            'email' => 'required|email',
            'password' => 'required',
            'c_password' => 'required|same:password',
        ]);

        if ($validator->fails()) {
            return response()->json(['error'=>$validator->errors()], 401);            
        }

        $input = $request->all();
        $input['password'] = bcrypt($input['password']);
        $user = User::create($input);
        $success['token'] =  $user->createToken('MyApp')->accessToken;
        $success['name'] =  $user->name;

        return response()->json(['success'=>$success], $this->successStatus);
    }

    /**
     * details api
     *
     * @return \Illuminate\Http\Response
     */
    public function details()
    {
        $user = Auth::user();
        return response()->json(['success' => $user], $this->successStatus);
    }
}

好的,開始測試一下旱幼,我一般使用的調(diào)試工具是 postman

1. 注冊
注冊.png
2.登錄
登錄.png
3.獲取詳情(需要注意一下查描,post提交時候需要配置一下 Headers)

格式為

Accept:application/json
Authorization:Bearer+空格+access_token
獲取用戶詳情.png

這樣說明API的認(rèn)證和測試正常啦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市柏卤,隨后出現(xiàn)的幾起案子冬三,更是在濱河造成了極大的恐慌,老刑警劉巖缘缚,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勾笆,死亡現(xiàn)場離奇詭異,居然都是意外死亡桥滨,警方通過查閱死者的電腦和手機窝爪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來齐媒,“玉大人蒲每,你說我怎么就攤上這事∮骼ǎ” “怎么了邀杏?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長唬血。 經(jīng)常有香客問我望蜡,道長,這世上最難降的妖魔是什么刁品? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任泣特,我火速辦了婚禮,結(jié)果婚禮上挑随,老公的妹妹穿的比我還像新娘状您。我一直安慰自己勒叠,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布膏孟。 她就那樣靜靜地躺著眯分,像睡著了一般。 火紅的嫁衣襯著肌膚如雪柒桑。 梳的紋絲不亂的頭發(fā)上弊决,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機與錄音魁淳,去河邊找鬼飘诗。 笑死,一個胖子當(dāng)著我的面吹牛界逛,可吹牛的內(nèi)容都是我干的昆稿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼息拜,長吁一口氣:“原來是場噩夢啊……” “哼溉潭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起少欺,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤喳瓣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后赞别,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畏陕,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年仿滔,在試婚紗的時候發(fā)現(xiàn)自己被綠了蹭秋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡堤撵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出羽莺,到底是詐尸還是另有隱情实昨,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布盐固,位于F島的核電站荒给,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏刁卜。R本人自食惡果不足惜志电,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蛔趴。 院中可真熱鬧挑辆,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至魁亦,卻和暖如春渔隶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洁奈。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工间唉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人利术。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓呈野,卻偏偏與公主長得像,于是被迫代替她去往敵國和親氯哮。 傳聞我的和親對象是個殘疾皇子际跪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容