当前位置: 首页 > 知识库问答 >
问题:

用户会话验证的Laravel API路由

樊杰
2023-03-14

我已经开始了一个现有的Laravel 5.2项目的工作。我需要为应用程序的前端构建一些基本的应用程序接口请求来与数据库交谈。这些路由需要由用户的会话进行身份验证。

我已经尝试使用auth:api驱动程序设置中间件,并且在/config/auth。php将api['driver']设置为'session'。但是,我一直将302重定向到登录页面,即使用户已通过所有权限和角色的身份验证。

有人能推荐一些关于如何基于用户会话实现API身份验证的阅读资料或其他解决方案吗?

从路线/api.php:

Route::group(["middleware" => ["auth:api"]], function () {
    // results in 302 redirect to /login
    Route::get('test', function(){
        return "TEST";
    });    

});

从配置/auth.php

'guards' => [
'web' => [
    'driver' => 'session',
    'provider' => 'users',
],

'api' => [
    'driver' => 'session',
    'provider' => 'users',
],

app/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
    ];
}

共有2个答案

司空实
2023-03-14

问题是您没有在请求中传递任何身份验证头,因此,很明显,它会将您重定向到登录屏幕,即使您使用postman点击API也是如此。

要证明这一点,请尝试从以下行中删除auth中间件Route::组(["middleware"=

如果您想在api中包含auth,请阅读Laravel的Passport文档。如果您想要更简单的东西,请从文档中的onceBasic Auth中间件开始。

我希望这为你指明了正确的方向!

如果你还有其他问题,请告诉我。

干杯

王波
2023-03-14

这是一篇老文章,但根据我的经验和我所学到的,我们不使用基于会话的机制对来自第三方应用程序的API请求进行身份验证b/c基于会话的身份验证就像如果您还没有经过身份验证(比如还没有登录),它会将您重定向到登录页面(就像这个问题的作者所说的)“正在将302重定向到登录页”)。

但是API请求是XMLHttpRequest(ajax请求),而不是浏览器请求,如果是,它怎么能重定向到登录页面?(检查开发工具中的网络选项卡,您将看到,来自该请求的响应是302,响应主体是登录html页面)。

因此,我们应该只使用基于令牌的机制进行API身份验证,这将返回像“你没有经过身份验证”这样的消息作为json响应,这可以被您的第三方应用程序使用。

具体来说,对于laravel,您可以使用会话提供程序进行api保护,但需要转到内核。php和add

\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Session\Middleware\StartSession::class

,这是基于laravel会话的身份验证的核心。否则,即使您已经登录,您仍将未经身份验证,因为默认情况下,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

 类似资料:
  • 问题内容: 我有一个会话验证过滤器,当会话过期时该过滤器注销用户。 这是一段代码,但是没有用。不起作用意味着即使会话过期,它也不会重定向到登录页面。 请帮助我解决此问题。 问题答案: 我有一个会话验证过滤器,当会话过期时该过滤器注销用户。 老实说,这完全没有道理。如果将已登录用户存储为会话的属性,并基于会话中已登录用户的存在来拦截“已登录”状态,则在任何时候都不需要手动注销该用户。会话已过期。当会

  • 在身份验证等情况下,与会话相比,使用JWTs有什么优势? 它是作为独立方法使用还是在会话中使用?

  • 我正在用Spring开发一个网站,我使用Spring Security进行身份验证。我有个无法解决的问题: 当会话被破坏(例如WebSecurityConfigurerAdapter中的更改)时,会显示第二个div导致内部服务器错误,因为session.User对象为NULL。 当用户会话被破坏时,如何使用户“未经身份验证”? 编辑:SecurityConfig 调用/注销时的Spring Sec

  • 我的web应用程序的当前架构有一个网关服务器,它组织了一系列微服务,授权发生在网关,如果给定的原则被认证,它们可以与一些下游服务对话。 下游服务获取所需的数据,以标识给定的经过身份验证的客户端。然而,Spring证券违约行为开始出现,并引发了预期的: 假定我可以在任何给定的微服务中使用会话id和+XSRF令牌来验证用户是否经过身份验证,并知道哪个用户登录了(我目前使用的是Http Basic)。

  • FreeRADIUS支持各种身份验证协议。它们的复杂程度各不相同,PAP最简单,EAP最复杂。 编辑用户文件 如果用户存储由用户文件组成,请记住在用户文件最新更改生效之前必须向运行的FreeRADIUS进程发送SIGHUP信号才能生效。 #> kill -1`cat / var / run / radiusd.pid` 如果你不知道SIGHUP信号是什么,它有很长的历史,在这个维基百科页面上有解

  • 可以在路由规则定义的时候调用validate方法指定验证器类对请求的数据进行验证。 例如下面的例子表示对请求数据使用验证器类app\index\validate\User进行自动验证,并且使用edit验证场景: Route::post('hello/:id', 'index/hello') ->model('id', 'app\index\model\User') ->valida