【问题标题】:Laravel 5.3 Passport routes is using web middlewareLaravel 5.3 Passport 路由正在使用 Web 中间件
【发布时间】:2017-01-03 12:39:22
【问题描述】:

Laravel 5.3 Passport 组件看起来很酷,但我对此有些困惑。

文档中 Passport 在 API Authentication 下,当设置 config/auth.php 时,它将驱动程序更改为守卫 'api' 的 'passport'。

Laravel 5.3 有 web.php 和 api.php 来区分路由组以使用 web 中间件或 api 中间件。

安装 Passport 后,需要将 Passport:routes() 添加到 AuthServiceProvider。当我运行 route:list 时,它会显示新路由都在使用 web 和 auth 中间件。

我的问题是为什么这些护照路由使用网络中间件?据我了解,Passport 应该适用于无状态 API 身份验证,但 Web 中间件不是。

【问题讨论】:

    标签: php oauth2 laravel-5.3


    【解决方案1】:

    我也面临这个问题,直到我意识到我对护照工作原理的理解是错误的。

    Passport 是关于在用户同意的情况下授予客户端应用程序用户的数据(这就是 OAuth2 的工作方式)。因此,当客户端应用程序尝试获取最终将授予对该用户数据的访问权限的访问令牌时,必须征得该用户的同意。 Web 中间件作为一个层来获取该用户的同意。要签署同意书,用户必须先登录,否则将无法证明它是实际用户。

    为了更好地理解,请考虑您的应用尝试实现“使用 Google 登录”功能的场景。您在登录页面中放置了一个重定向到 Google 的按钮,重定向后,用户登录到他们的 Google 帐户,签署同意书并使用授权码重定向回您的应用程序。就是这样,这里 Google 是您正在构建的应用程序,另一个应用程序是客户端应用程序。

    如果进行实际实施,仍然是理解这一点的最佳方法。只需在 laravel 中创建一个新应用,并将此代码放在 routes/web.php 文件中即可。

    Route::get('/redirect', function () {
        $query = http_build_query([
            'client_id' => 'YOUR APP'S CLIENT ID',
            'redirect_uri' => 'THE CALLBACK YOU GAVE DURING CREATING THE CLIENT',
            'response_type' => 'code',
            'scope' => '',
        ]);
    
        return redirect('http://your-app.com/oauth/authorize?'.$query);
    });
    

    然后使用/redirect 路由访问新应用。确保您的主应用程序也在运行。

    【讨论】:

      【解决方案2】:

      我似乎已经解决了这个问题。

      我做的第一件事是从这里 https://github.com/barryvdh/laravel-cors 添加和配置一个 CORS 中间件

      然后我通过编辑 app/Providers/AuthServiceProvider.php 将 Passport 路由包装在一个路由组中

      /** 
       * Register any authentication / authorization services.
       *
       * @return void
       */
      public function boot()
      {   
          $this->registerPolicies();
      
          Route::group(['prefix' => 'api', 'middleware' => 'cors'], function() {
      
              Passport::routes();
      
          }); 
      }
      

      理论上,如果您想在 API 之外使用 oauth 服务,您可以有两个 Passport 路由实例,一个带有 /api 前缀和 cors 中间件,一个没有,这样您就不会丢失在浏览器中使用 oauth 时的跨域保护。

      【讨论】:

      • 不幸的是,这对我没有帮助。它所做的只是将中间件添加到已经存在的中间件列表中。因此,我没有将中间件从“web,auth”更改为“cors”,而是得到了“cors,web,auth”。对应该对您进行身份验证的事情进行身份验证似乎有点遥远:-)
      猜你喜欢
      • 2017-02-28
      • 1970-01-01
      • 2017-04-04
      • 2017-01-25
      • 2017-05-25
      • 2017-08-10
      • 1970-01-01
      • 2017-03-06
      • 2017-02-11
      相关资源
      最近更新 更多