使用Laravel5.6+Passsport 构建Api项目
场景:需要将原有的系统,对接App。原有的系统用的是Laravel5.4框架,没有采用Laravel自带的auth认证模块,项目自己写了认证。而我经过多方面的考虑,发现还是使用passport来做OAuth2.0会比较快捷。在原有系统上无法叠加,所以决定放弃单独重写Api项目。
正文:
第一步,启用一个新的项目
# 如果没有composer,请先安装composer
# 如果没有laravel安装器,请先下载安装器
composer global require "laravel/installer"
# 生成api.com项目
laravel new api.com
第二步,先开启http,auth认证
cd api.com
php artisan make:auth
php artisan migrate
# 认证生成完成,在浏览器中打开 http://api.com/login
# 当然,能打开的前提是你开启了php7自带的web服务,或者配好了nginx
上面已完成http的认证,下面加入passport,实现api认证
第三步,下载passport
composer require laravel/passport
第四步,数据库迁移
php artisan migrate
第五步,生成加密键和两个预置的令牌
php artisan passport:install
# 生成记录存放在数据表 oauth_clients
第六步,修改user模型,这个模型是在第二步创建的,位于app/User.php
<?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,在app/Provider/AuthServiceProvider.php中
<?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
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
使用(因为是一手APP,不是第三方,所以采用文档里提到的密码授权令牌)
第一步,用client_secret获取token(可以使用postman实现)
Route::get('/auth/password', function (\Illuminate\Http\Request $request){
$http = new \GuzzleHttp\Client();
$response = $http->post('http://api.com/oauth/token', [
'form_params' => [
'grant_type' => 'password',
'client_id' => '2',
'client_secret' => 'XtkyWdevgTnqbVtWTd8l7ASx76VtBBuZHzlAbCvm',
'username' => '[email protected]',
'password' => 'test123',
'scope' => '',
],
]);
return json_decode((string)$response->getBody(), true);
});
第二步,通过第一步的token,去调用其他接口,比如下面的获取用户信息接口
Route::middleware('auth:api')->prefix('v1')->group(function (){
Route::get('/user', function (Request $request) {
return $request->user();
});
});
传递访问令牌
调用被 Passport 保护的路由时,应用 API 的消费者需要在请求的 Authorization 头中指定它们的访问令牌作为 Bearer 令牌。例如
$response = $client->request('GET', '/api/user', [
'headers' => [
'Accept' => 'application/json',
'Authorization' => 'Bearer '.$accessToken,
],
]);
上面在传递参数正确的情况下,会返回当前用户模型,如果不传或者错误Authorization
,会返回{"message":"Unauthenticated."}
以上,完成Laravel-passport Api认证
拓展,可以设置token有效期,具体参考文档-令牌生命周期