laravel 护照授权码授予 PKCE 需要范围
laravel passport authorization code grant PKCE requires scope
我正在尝试使用 Laravel Passport 和我的 SPA 应用程序实现授权码授予。我偶然发现了以下问题:
据我所知,OAuth 中的范围是可选的,我在请求代码时不必请求范围。甚至 HERE 它说范围是可选的。
事情是这样的:
- 我要从我的 SPA 转到下面的这个 URL
/oauth/authorize?client_id=5&redirect_uri=http://localhost:3000/auth&response_type=code&scope=''&state=hdeqcsaeol7z8569pyl2gmrvl8bdaun4gjxhs78u&code_challenge=LuiQWey7K8Uu1w5Xj0vqOinf0YpXEaYK374PLnelh80=&code_challenge_method=S256
- 如果
scope
是空字符串我得到
/auth?error=invalid_scope&error_description=The%20requested%20scope%20is%20invalid,%20unknown,%20or%20malformed&hint=Check%20the%20%60%26%23039%3B%26%23039%3B%60%20scope&message=The%20requested%20scope%20is%20invalid,%20unknown,%20or%20malformed
- 如果
scope
完全丢失,我得到
{"error":"invalid_request","error_description":"The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.","hint":"Code challenge must follow the specifications of RFC-7636.","message":"The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed."}
所以问题是我不想使用范围,我不需要它们我只是想获得一些默认范围或 none。
我想我可以定义一个,但这对我来说似乎不合适。它应该是可选的。
这就是我为该流程创建所有代码的方式:
有人知道这是怎么回事吗?
此致,
罗布
在你的 URL 中有 scope=''&
而不是 scope=&
。
尝试使用 http_build_query()
作为 per docs 构建查询参数。
$query = http_build_query([
'client_id' => 'client-id',
'redirect_uri' => 'http://third-party-app.com/callback',
'response_type' => 'code',
'scope' => '',
'state' => $state,
'code_challenge' => $codeChallenge,
'code_challenge_method' => 'S256',
]);
其次,您的 code_challenge
以 =
结尾。
所以你可能应该:
- 去掉
this.challenge
末尾的=
号
- 将
+
替换为this.challenge
-
- 将
/
替换为this.challenge
_
PHP 例子
$encoded = base64_encode(hash('sha256', $code_verifier, true));
$codeChallenge = strtr(rtrim($encoded, '='), '+/', '-_');
据我所知,您可以将作用域硬编码为“*”,这应该可行,我也这样做了。
我正在尝试使用 Laravel Passport 和我的 SPA 应用程序实现授权码授予。我偶然发现了以下问题:
据我所知,OAuth 中的范围是可选的,我在请求代码时不必请求范围。甚至 HERE 它说范围是可选的。
事情是这样的:
- 我要从我的 SPA 转到下面的这个 URL
/oauth/authorize?client_id=5&redirect_uri=http://localhost:3000/auth&response_type=code&scope=''&state=hdeqcsaeol7z8569pyl2gmrvl8bdaun4gjxhs78u&code_challenge=LuiQWey7K8Uu1w5Xj0vqOinf0YpXEaYK374PLnelh80=&code_challenge_method=S256
- 如果
scope
是空字符串我得到
/auth?error=invalid_scope&error_description=The%20requested%20scope%20is%20invalid,%20unknown,%20or%20malformed&hint=Check%20the%20%60%26%23039%3B%26%23039%3B%60%20scope&message=The%20requested%20scope%20is%20invalid,%20unknown,%20or%20malformed
- 如果
scope
完全丢失,我得到
{"error":"invalid_request","error_description":"The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.","hint":"Code challenge must follow the specifications of RFC-7636.","message":"The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed."}
所以问题是我不想使用范围,我不需要它们我只是想获得一些默认范围或 none。
我想我可以定义一个,但这对我来说似乎不合适。它应该是可选的。
这就是我为该流程创建所有代码的方式:
有人知道这是怎么回事吗?
此致, 罗布
在你的 URL 中有 scope=''&
而不是 scope=&
。
尝试使用 http_build_query()
作为 per docs 构建查询参数。
$query = http_build_query([
'client_id' => 'client-id',
'redirect_uri' => 'http://third-party-app.com/callback',
'response_type' => 'code',
'scope' => '',
'state' => $state,
'code_challenge' => $codeChallenge,
'code_challenge_method' => 'S256',
]);
其次,您的 code_challenge
以 =
结尾。
所以你可能应该:
- 去掉
this.challenge
末尾的 - 将
+
替换为this.challenge
-
- 将
/
替换为this.challenge
_
=
号
PHP 例子
$encoded = base64_encode(hash('sha256', $code_verifier, true));
$codeChallenge = strtr(rtrim($encoded, '='), '+/', '-_');
据我所知,您可以将作用域硬编码为“*”,这应该可行,我也这样做了。