1. 程式人生 > >laravel Passport - 創建 REST API 用戶認證以及Dingo/Api v2.0+Passport實現api認證

laravel Passport - 創建 REST API 用戶認證以及Dingo/Api v2.0+Passport實現api認證

config mode margin 程序 services ssi ive NPU apps

第一部分:

安裝passport

使? Composer 依賴包管理器安裝 Passport :

composer require laravel/passport  

接下來,將 Passport 的服務提供者註冊到配置?件 config/app.php 的providers 數組中:(5.6後不用加 )

Laravel\Passport\PassportServiceProvider::class

utf8 的 varchar 類型字符串最長255,換成utf8mb4最長是191,然而框架裏面默認長度還是用的 255 導致長度不夠了。

所以我們要修改app/Providers/AppServiceProvider.php :
    use Illuminate\Support\Facades\Schema;   
      
    public function boot()  
    {  
        Schema::defaultStringLength(191);  
    }  

在.env 和congfig/database.php文件配置好數據庫

然後運行artisan生成數據表:

    php artisan make:auth //必須先運行這個,因為Passport 使用服務提供者註冊內部的數據庫遷移腳本目錄  
    php artisan migrate //再更新  

然後運行 passport:install 命令來創建生成安全訪問令牌時用到的加密密鑰,同時,這條命令也會創建「私人訪問」客戶端和「密碼授權」客戶端:

php artisan passport:install

完成上面的步驟,我們可以配置一下Passport。

1. 在Model中,我們需要增加 HasApiTokens class,
2. 在AuthServiceProvider中, 增加 "Passport::routes()", 還可以增加過期時間
3. 在 auth.php中, 更改 api 認證方式為password.

1. app/User.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; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ ‘name‘, ‘email‘, ‘password‘, ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ ‘password‘, ‘remember_token‘, ]; }

2. app/Providers/AuthServiceProvider.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();
  
        Passport::tokensExpireIn(now()->addDays(30));  //這裏設置為30天過期

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


} }

3. config/auth.php

return [
    .....
    .....
    ‘guards‘ => [
        ‘web‘ => [
            ‘driver‘ => ‘session‘,
            ‘provider‘ => ‘users‘,
        ],
        ‘api‘ => [
            ‘driver‘ => ‘passport‘,//這裏做了修改
            ‘provider‘ => ‘users‘,
        ],
    ],
    .....
    .....
]

配置 routes/api.php ,增加相應API路由配置

Route::post(‘login‘, ‘api\LoginController@login‘);  
Route::post(‘register‘, ‘api\LoginController@register‘);  
  
Route::group([‘middleware‘ => ‘auth:api‘], function(){  
    Route::post(‘details‘, ‘api\LoginController@details‘);  
});  

創建controller ---》php artisan make:controller Api/LoginController

代碼如下

class LoginController 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 = \App\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);
    }

我們測試API使用Postman,在谷歌瀏覽器插件裏可以安裝它。

技術分享圖片

2. Login API

技術分享圖片

3. Get Detailss API

Now,我們來測試API數據獲取, 我們需要添加headers在測試Postman中,$accessToken使用Login中的Token即可 格式 Authorization Bearer空格+token

技術分享圖片

第二部分:Dingo/Api v2.0+Passport實現api認證

1.在composer.json中添加
"require": {
    "dingo/api": "2.0.0-alpha1"
}

2.在控制臺中運行

php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"

打開 config/app.php,註冊必要的 service provider 在你的應用 providers 之前 5.6後可以不加

    ‘providers‘ => [  
        Dingo\Api\Provider\LaravelServiceProvider::class  
    ]  

再次設置更改路由,

打開 routes/api.php 文件添加

$api = app(‘Dingo\Api\Routing\Router‘);
$api->version(‘v1‘,function ($api) {
    $api->post(‘login‘, ‘App\Http\Controllers\Api\LoginController@login‘);
    $api->post(‘register‘, ‘App\Http\Controllers\Api\LoginController@register‘);
    $api->group([‘middleware‘ => ‘auth:api‘], function($api){
        $api->post(‘details‘, ‘App\Http\Controllers\Api\LoginController@details‘);
    });
});

技術分享圖片

這裏我們可以用剛才生成的Client ID與Client Secret來密碼認證訪問,註冊,登錄 與詳情頁面,都能正常訪問。(這幾個頁面的訪問不變,程序代碼不變)。

laravel Passport - 創建 REST API 用戶認證以及Dingo/Api v2.0+Passport實現api認證