PKCE 应根据RFC 8252使用。我想独立的公共 SPA 可以被视为与原生应用程序相同的术语,因为无法存储客户端机密。
第 6 节要求客户端和服务器都将 PKCE 用于公共本机应用程序客户端。授权服务器应该通过
返回错误消息来拒绝
来自不使用 PKCE 的本机应用程序的授权请求,如 PKCE
[RFC7636] 的第 4.4.1 节中所定义。
我已经阅读了上面的 RFC,它帮助我理解了它。我认为 Laravel 文档中 PKCE 的文档有点奇怪(例如假设一个 PHP 客户端)。
正如您所说,不再建议使用隐式授权令牌(RFC 8252 #8.3):
OAuth 2.0 隐式授予授权流程(在
OAuth 2.0 [RFC6749] 的第 4.2 节中定义)通常适用于在浏览器中执行授权请求并
通过基于 URI 的应用间通信接收授权响应的做法。
但是,由于隐式流不能被 PKCE [RFC7636]
(第 8.1 节要求)保护,因此不建议将隐式流与本机应用程序一起使用。
我已经设置了一个带有工作 PKCE 流的 SPA。我创建了一个新的客户端模型,然后我用它来跳过您上面提到的对话框。
身份验证服务提供者:
<?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);
}
}
应用\护照\模型\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”方案重定向之类的措施作为身份证明。某些操作系统可能会提供可能被接受的替代平台特定身份特征,视情况而定。