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