【问题标题】:Vue SPA with Laravel 6 Passport带有 Laravel 6 Passport 的 Vue SPA
【发布时间】:2020-05-28 11:11:44
【问题描述】:

背景:我在身份验证方面的唯一经验是普通的基于表单的登录、典型的用户名和通过重定向或使用 JWT 进行常规登录的控制器的密码。我想使用 Laravel Passport 来实现同样的目标。

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

应用需要是具有角色和权限的多用户。

我了解到,最好的方法是对 SPA 使用“带有 PKCE 的授权代码授予”。

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

有没有办法绕过这个? (我尝试使用带有 skipsAuthorization 的自定义客户端,但这似乎不起作用) 我是否使用了正确的 OAuth 流程?

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

密码授予客户端:不过,这需要一个秘密,所以我不知道如何使用它? 隐式授予令牌:现在不鼓励使用,不应使用。

只留下个人访问令牌。但这是正确的“流程”吗?

【问题讨论】:

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


    【解决方案1】:

    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”方案重定向等措施 由授权服务器作为身份证明。一些操作系统 可能会提供替代的特定于平台的身份特征 酌情接受。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-03
    • 2020-08-26
    • 2017-07-25
    • 2020-08-02
    • 2017-07-19
    • 2019-10-12
    • 2021-03-29
    • 2018-07-26
    相关资源
    最近更新 更多