同域名利用能够应用框架自带的登录页面(基于 Session)实现登录,登录胜利后应用 laravel_token(基于 Cookie)实现 API 申请认证。
装置 & 初始化
composer require laravel/passport
php artisan migrate
# 执行 passport 的装置过程
php artisan passport:install
- 在 storage 目录下生成
oauth-private.key
和oauth-public.key
,别离为 OAuth 服务的私钥和公钥,用于平安令牌的加密解密。 - 在
oauth_clients
数据表中初始化两条记录,相当于注册两个客户端利用,一个用于明码受权令牌认证,一个用于私人访问令牌认证。
批改模型类
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable
{
# 该 Trait 中蕴含了受权令牌与客户端的相干办法
use HasApiTokens, Notifiable;
...
}
注册 API 认证相干路由
use Laravel\Passport\Passport;
public function boot()
{
// API 认证路由注册
Passport::routes();}
默认提供的路由控制器位于 \Laravel\Passport\Http\Controllers
命名空间下,并且路由前缀为 /oauth
。
批改配置文件
批改配置文件 config/auth.php
,将 API 认证驱动由 token
批改为 passport
:
'guards' => [
...
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
单页面利用 API 认证
如果 API 认证只用于客户端 JavaScript 与后端接口的交互,比方同域名利用,没必要走简单的跳转受权流程,能够在 App\Http\Kernel
的 $middlewareGroups
中新增一个 CreateFreshApiToken
中间件来实现:
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\Laravel\Passport\Http\Middleware\CreateFreshApiToken::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
];
该中间件注册在 web
路由中,当用户通过 Web 页面登录后会在 Cookie 中设置一个 Token,后续客户端发送申请时就会在 Cookie 中主动带上这个 Token。
在拜访须要认证的 API 接口时,会走 auth:api
认证中间件,因为咱们在配置文件 config/auth.php
中配置的 API 认证驱动是 passport
,在 Laravel 框架底层,依据中间件传入的参数 api
,针对 API 接口认证会通过 Laravel\Passport\Guards\TokenGuard
获取认证信息:
public function user(Request $request)
{if ($request->bearerToken()) {return $this->authenticateViaBearerToken($request);
} elseif ($request->cookie(Passport::cookie())) {return $this->authenticateViaCookie($request);
}
}
如果申请头中蕴含 Bearer Authentication
申请头,则获取对应的申请头 Token 信息,否则从 Cookie 中获取名为 laravel_token
的 Token 信息,因为在保留这个 Token 的时候蕴含了用户 ID,所以能够提取其中的用户 ID 从数据库获取用户数据并返回,从而实现用户认证判断和信息获取。
测试单页面利用 API 认证
Laravel 框架默认在 routes/api.php
中提供了一个认证 API 路由,能够基于这个路由进行测试:
// 为了不便测试,先疏忽 CSRF 校验
\Laravel\Passport\Passport::$ignoreCsrfToken = true;
Route::middleware('auth:api')->get('/user', function (Request $request) {return $request->user();
});
在浏览器中拜访这个 API 接口,因为没有登录,会跳转到登录表单。登录实现后,就能够通过 http://blog.test/api/user
获取用户信息了。
通过浏览器开发者工具,在「Network」中查看申请 Cookie 数据就能够看到 laravel_token
的信息。