第一部分:
安裝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);//這里追蹤到app/user.php $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"
在.env文件添加
API_STANDARDS_TREE=vnd # 公開的及商業項目用 vnd API_SUBTYPE=api-demo # 項目簡稱 API_PREFIX=api # 前綴 API_VERSION=v1 # 不提供版本時使用的版本號 API_NAME="Laravel Api Demo" # 使用 API Blueprint 命令生成文檔的時候才用到 API_STRICT=false # Strict 模式要求客戶端發送 Accept 頭而不是默認在配置文件中指定的版本,這意味着你不能通過Web瀏覽器瀏覽API API_DEFAULT_FORMAT=json API_DEBUG=false # 開啟 debug 模式
打開 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來密碼認證訪問,注冊,登錄 與詳情頁面,都能正常訪問。(這幾個頁面的訪問不變,程序代碼不變)。
1.使用其他的數據表 例如test_user 只需在app/user.php中添加protected $table = 'test_user';
2.你可以自己定義你想要的登錄驗證字段
if(Auth::attempt(['id' => request('id'), 'password' => request('password')])){//這里修改為了id和密碼 $user = Auth::user(); $success['token'] = $user->createToken('MyApp')->accessToken; return response()->json(['success' => $success], $this->successStatus); } else{ return response()->json(['error'=>'Unauthorised'], 401); }
當然你也可以把app/user.php移動到app/Models下面 所有的數據模型文件,都 必須 存放在:app/Models/ 文件夾中。這樣更合理
然后修改
- 修改User.php的namespace為
App\Models - 執行
composer dumpautoload,重新加載類 - 將
config/auth.php文件中的providers部分的model對應的類,修改為App\Models\User::
