我已经开始研究现有的Laravel 5.2项目了。我需要为应用程序的前端构建一些基本的API请求来与数据库通信。这些路由需要由用户的会话进行身份验证。
我尝试使用auth:api驱动程序设置中间件,并在../config/auth.php中将api ['driver']设置为'session'。但是,即使用户使用所有权限和角色进行身份验证,我仍然会将302重定向到登录页面。
有人可以推荐一些关于如何根据用户会话实现API身份验证的阅读或其他解决方案的想法吗?
来自routes / api.php的:
Route::group(["middleware" => ["auth:api"]], function () {
// results in 302 redirect to /login
Route::get('test', function(){
return "TEST";
});
});
来自config / auth.php的
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'session',
'provider' => 'users',
],
应用程序/ HTTP / Kernel.php
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array
*/
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\App\Http\Middleware\NoCache::class,
];
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
];
/**
* The application's route middleware.
*
* These middleware may be assigned to groups or used individually.
*
* @var array
*/
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'role' => \Zizaco\Entrust\Middleware\EntrustRole::class,
'permission' => \Zizaco\Entrust\Middleware\EntrustPermission::class,
'ability' => \Zizaco\Entrust\Middleware\EntrustAbility::class,
'dashboard' => \App\Http\Middleware\dashboardMiddleware::class,
'system' => \App\Http\Middleware\systemMiddleware::class
];
}
答案 0 :(得分:0)
这是旧帖子,但根据我的经验和我所了解的,我们不会对来自第三方应用程序 b/c 基于会话的身份验证的 API 请求使用基于会话的机制身份验证,就像您尚未通过身份验证一样(比如还没有登录),它会将你重定向到登录页面(就像这个问题的作者说的“让 302 重定向到登录页面”)。
但是API请求是XMLHttpRequest(ajax请求),而不是浏览器请求,如果是这样,它如何将您重定向到登录页面? (检查开发者工具中的网络选项卡,您会看到,此请求的响应是 302,响应正文是登录 html 页面)。
因此,我们应该只使用基于令牌的 API 身份验证机制,它会以 json 响应形式返回诸如“您未通过身份验证”之类的消息,您的 3rd 方应用可以使用这些消息。
具体对于laravel,你可以使用会话提供者来做apiguard,但是你需要去Kernel.php 并添加
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Session\Middleware\StartSession::class
, 这是基于 Laravel 会话的身份验证的核心, 到您的 api 中间件组。否则,即使您已经登录,您仍然是未经身份验证的 因为默认情况下,laravel api 路由没有必要的中间件用于基于会话的身份验证。
protected $middlewareGroups = [
'web' => [
// ...
],
'api' => [
\App\Http\Middleware\EncryptCookies::class, // <------- ADD THIS
\Illuminate\Session\Middleware\StartSession::class, // <------ ADD THIS
// ...
],
];
参考: https://laracasts.com/discuss/channels/laravel/protecting-api-routes-with-session-guard https://laravel.io/forum/02-09-2016-52-ajax-auth-not-picking-up-session
答案 1 :(得分:-2)
问题是您没有在请求中传递任何身份验证标头,因此,很明显它会将您重定向到登录屏幕,即使您使用邮递员点击API也是如此。
为了证明这一点,请尝试从路由文件中的以下行auth
中删除Route::group(["middleware" => ["auth:api"]], ...
中间件,如果达到测试路径,则应该能够将TEST作为响应。此外,请记住,我们的api会自动将api /前缀绑定到所有api路由。因此,您应该向/api/test
发出请求,然后您应该返回TEST。
如果您想在您的API中加入auth,请阅读Laravel's Passport docs。如果您想要更简单的东西,请从docs中的onceBasic Auth中间件开始。
我希望这能以正确的方式指出你!
如果您有任何其他问题,请告诉我。
干杯!