同域名应用能够使用框架自带的登陆页面(基于Session)实现登陆,登陆成功后使用laravel_token(基于Cookie)实现 API 请求认证。php
composer require laravel/passport php artisan migrate
# 执行 passport 的安装过程 php artisan passport:install
oauth-private.key
和 oauth-public.key
,分别为 OAuth 服务的私钥和公钥,用于安全令牌的加密解密。oauth_clients
数据表中初始化两条记录,至关于注册两个客户端应用,一个用于密码受权令牌认证,一个用于私人访问令牌认证。use Laravel\Passport\HasApiTokens; class User extends Authenticatable { # 该 Trait 中包含了受权令牌与客户端的相关方法 use HasApiTokens, Notifiable; ... }
use Laravel\Passport\Passport; public function boot() { // API 认证路由注册 Passport::routes(); }
默认提供的路由控制器位于 \Laravel\Passport\Http\Controllers
命名空间下,而且路由前缀为 /oauth
。laravel
修改配置文件 config/auth.php
,将 API 认证驱动由 token
修改成 passport
:web
'guards' => [ ... 'api' => [ 'driver' => 'passport', 'provider' => 'users', ], ],
若是 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
获取认证信息:api
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 从数据库获取用户数据并返回,从而完成用户认证判断和信息获取。浏览器
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
获取用户信息了。cookie
经过浏览器开发者工具,在「Network」中查看请求 Cookie 数据就能够看到 laravel_token
的信息。composer