背景:我对身份验证的唯一经验是基于表单的常规登录名,典型的用户名以及通过重定向或通过常规登录使用JWT的控制器的密码。我想使用Laravel Passport实现相同的功能。
我需要使用Vue和Laravel Passport(带有Dingo API的Laravel 6x)创建一个SAAS应用程序。
该应用必须是具有角色和权限的多用户。
我已经读到,最好的方法是将“带有PKCE的授权代码授予”用于SPA。
我遇到的问题是我的Vue应用设置了代码挑战等。请求授权代码,然后定向到Laravel登录页面,但是一旦我登录,我得到以下信息屏幕:
有什么办法可以绕过这个? (我尝试将自定义客户端与skipsAuthorization一起使用,但这似乎不起作用) 我使用的是正确的OAuth流吗?
在Laravel Passport文档中,有以下内容:
密码授予客户端:不过,这需要一个秘密,因此我看不到如何使用它? 隐式授予令牌:现在不建议使用,不应该使用。
仅保留个人访问令牌。但这是使用的正确“流程”吗?
答案 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”方案重定向之类的措施 由授权服务器作为身份证明。一些操作系统 可能提供替代平台特定的身份功能,可能 被接受。