Laravel實(shí)現(xiàn)dingo+JWT api接口之配置篇
Laravel實(shí)現(xiàn)dingo+JWT api接口之實(shí)戰(zhàn)篇
-
安裝dingo
- 你需要修改你的
composer.json
文件彼城,然后執(zhí)行composer update
把最后一個版本的包加入你的項目
"require": {
"dingo/api": "1.0.*@dev"
}
或者直接
composer require dingo/api:1.0.x@dev
- 打開
config/app.php
弯予,注冊必要的service provider
在你的應(yīng)用providers
之前矩距。
'providers' => [
Dingo\Api\Provider\LaravelServiceProvider::class
]
- 生成dingo配置文件
config/api.php
:
php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"
- .env添加基礎(chǔ)配置(四個即可):
#標(biāo)準(zhǔn)樹
API_STANDARDS_TREE=vnd
#前綴
API_PREFIX=api
#版本
API_VERSION=v1
#開啟調(diào)試
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規(guī)格
1 本地或私有環(huán)境
2 prs 非商業(yè)銷售的項目
3 vnd 公開的以及商業(yè)銷售的項目
API_SUBTYPE - API簡稱
API_PREFIX - API前綴(或使用API_DOMAIN - API子域名)
API_VERSION - API默認(rèn)版本
API_NAME - API名稱
API_CONDITIONAL_REQUEST - 帶條件的請求卒密,由于緩存API請求的時候會使用客戶端緩存功能,所以默認(rèn)開啟了帶條件的請求
API_STRICT - 嚴(yán)格模式,要求客戶端發(fā)送Accept頭而不是默認(rèn)在配置文件中指定的版本
API_DEFAULT_FORMAT - 響應(yīng)格式,默認(rèn)的響應(yīng)格式是JSON
API_DEBUG - 調(diào)試模式
- 你需要修改你的
composer.json
文件,然后執(zhí)行composer update
把最后一個版本的包加入你的項目
"require": {
"tymon/jwt-auth": "0.5.*"
}
或者直接
composer require tymon/jwt-auth
- 打開
config/app.php
策州,注冊到providers
數(shù)組。
'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
文件中數(shù)組的secret
鍵成對應(yīng)的值:
php artisan jwt:generate
-
關(guān)聯(lián)dingo與JWT
修改 config/api.php
的 auth
如下:
'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
- 使用 Composer 依賴包管理器安裝 Passport :
composer require laravel/passport
- 接下來宫仗,將 Passport 的服務(wù)提供者注冊到配置文件
config/app.php
的providers
數(shù)組中:
Laravel\Passport\PassportServiceProvider::class,
Passport 使用服務(wù)提供者注冊內(nèi)部的數(shù)據(jù)庫遷移腳本目錄抽活,所以上一步完成后,你需要更新你的數(shù)據(jù)庫結(jié)構(gòu)锰什。Passport 的遷移腳本會自動創(chuàng)建應(yīng)用程序需要的客戶端數(shù)據(jù)表和令牌數(shù)據(jù)表: -
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
的默認(rèn)遷移下硕,你應(yīng)該在AppServiceProvider
的register
方法中調(diào)用Passport :: ignoreMigrations
方法。 你可以導(dǎo)出這個默認(rèn)遷移用php artisan vendor:publish --tag=passport-migrations
命令汁胆。
- 接下來梭姓,你需要運(yùn)行
passport:install
命令來創(chuàng)建生成安全訪問令牌時用到的加密密鑰
,同時嫩码,這條命令也會創(chuàng)建「私人訪問」客戶端
和「密碼授權(quán)」客戶端
:【運(yùn)行passport:install
命令誉尖,該命令將會創(chuàng)建生成安全訪問令牌(token)所需的加密鍵,此外铸题,該命令還會創(chuàng)建personal access
和password grant
客戶端用于生成訪問令牌铡恕,該命令會在storage
目錄中生成認(rèn)證需要的加密鍵,oauth-private.key
和oauth-public.key
】
php artisan passport:install
執(zhí)行上述代碼后的結(jié)果:
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
- 上面命令執(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 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.php
中 api
部分的授權(quán)保護(hù)項( driver
)改為 passport
其垄。此調(diào)整會讓你的應(yīng)用程序在接收到 API 的授權(quán)請求時使用 Passport 的 TokenGuard
來處理:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',//【可能這里需要修改】
],
],
- 如果用手機(jī)號進(jìn)行授權(quán)的話,需要修改模型
/**
* [findForPassport passport通過手機(jī)號/賬號驗證]
* @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();
}
-
dingo+passport結(jié)合
- 創(chuàng)建一個密碼發(fā)放客戶端
php artisan passport:client --password
配置Dingo使用Passport密碼發(fā)放令牌
- 創(chuàng)建
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
-
Swagger
- 安裝
composer require zircote/swagger-php
- 創(chuàng)建
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";
}