带有Laravel 6 Passport的Vue SPA

时间:2020-02-12 20:04:30

标签: vuejs2 oauth-2.0 laravel-passport laravel-6 pkce

背景:我对身份验证的唯一经验是基于表单的常规登录名,典型的用户名以及通过重定向或通过常规登录使用JWT的控制器的密码。我想使用Laravel Passport实现相同的功能。

我需要使用Vue和Laravel Passport(带有Dingo API的Laravel 6x)创建一个SAAS应用程序。

该应用必须是具有角色和权限的多用户。

我已经读到,最好的方法是将“带有PKCE的授权代码授予”用于SPA。

我遇到的问题是我的Vue应用设置了代码挑战等。请求授权代码,然后定向到Laravel登录页面,但是一旦我登录,我得到以下信息屏幕:

Authorization Request

有什么办法可以绕过这个? (我尝试将自定义客户端与skipsAuthorization一起使用,但这似乎不起作用) 我使用的是正确的OAuth流吗?

在Laravel Passport文档中,有以下内容:

密码授予客户端:不过,这需要一个秘密,因此我看不到如何使用它? 隐式授予令牌:现在不建议使用,不应该使用。

仅保留个人访问令牌。但这是使用的正确“流程”吗?

1 个答案:

答案 0 :(得分:3)

PKCE应根据RFC 8252使用。我猜想独立的公共SPA可以与本地应用程序用同样的术语考虑,因为无法存储客户机密。

第6节要求客户端和服务器均使用PKCE进行公开 本机应用程序客户端。授权服务器应拒绝
来自不使用PKCE的本机应用的授权请求,
返回错误消息,如PKCE
的4.4.1节所定义 [RFC7636]。

我已经阅读了上面的RFC,它帮助我绕开了头。我认为Laravel文档中PKCE的文档记录有点奇怪(例如,假设使用PHP客户端)。

正如您所说,不再建议使用隐式授予令牌(RFC 8252 #8.3):

OAuth 2.0隐式授予授权流程(在
中定义 OAuth 2.0 [RFC6749]的4.2节通常适用于这种做法 浏览器中执行授权请求并接收的信息
通过基于URI的应用间通信进行授权响应。
但是,由于隐式流不能被PKCE [RFC7636]保护,
(第8.1节中要求),将隐式流与 不推荐使用本机应用程序。

我已经设置了具有正常PKCE流程的SPA。我创建了一个新的客户端模型,然后将其用于跳过上述对话框。

AuthServiceProvider:

<?php
namespace App\Providers;

use App\Passport\Models\PkceClient;
use Laravel\Passport\Passport;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        'App\Model' => 'App\Policies\ModelPolicy',
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        Passport::routes();
        Passport::useClientModel(PkceClient::class);
    }
}

App \ Passport \ Models \ PkceClient:

<?php
namespace App\Passport\Models;

use Laravel\Passport\Client as BaseClient;

class PkceClient extends BaseClient
{
    public function skipsAuthorization()
    {
        return $this->firstParty();
    }
}

请注意,对于RFC 8252 8.6

不受信任的客户端,不应跳过该对话框

8.6。客户假冒

如OAuth 2.0 [RFC6749]的10.2节所述,授权 服务器不应自动处理授权请求
未经用户同意或互动,除非
客户可以放心。这包括用户拥有
的情况 先前已批准针对给定客户ID的授权请求- 除非可以证明客户的身份,否则该请求应该
就像没有任何先前的请求被批准一样处理。

可以接受诸如声明的“ https”方案重定向之类的措施 由授权服务器作为身份证明。一些操作系统 可能提供替代平台特定的身份功能,可能 被接受。