我正在尝试为基于 OIDC/OAuth2.0 的新 Matrix Auth 协议添加提供程序,该协议在 https://areweoidcyet.com/
中有概述这里的主要问题是,由于 Matrix 是可自托管和联合的,因此没有中央用户提供商,而是无穷无尽的。也不可能有一个配置定义的服务器,因为可能有来自不同服务器的用户使用单个服务。当有人尝试使用此登录名来查询正确的内容并将正确的 URL 输入到提供程序功能时,我希望有一个家庭服务器输入字段。有关其工作原理的示例位于 https://areweoidcyet.com/client-implementation-guide/
本质上,用户输入他们的 HS,客户端(这里是 laravel 应用程序)然后拉入
well known
和 auth_issuer
数据来找出正确的路径。
这对我来说很清楚。然而,我不清楚如何以非活泼的方式从 UI 获取主服务器 URL 到我的提供商。这可能吗?对于 UI,我使用 Intertia 而不是 Blade。但如果需要的话,我也可以将刀片知识转移到我的设置中。
请随时询问有关此问题的更多问题,以便我得到好的答案。
到目前为止,我已经查看了各种其他答案以及如何创建提供程序,但他们似乎都期望身份验证提供程序的静态 url。这在使用中央身份验证的正常 OAuth2 设置中是有意义的。然而,这在我的用例中并不是给定的。
我还看到了使用配置值的建议,但这很有趣。其他人建议使用数据库模型,但我担心这对于让未经身份验证的用户写入数据库来说不是很安全。
由于你无法自由地向Socialite Provider传递值,所以你别无选择,只能使用config。
// Socialite Provider
/**
* {@inheritdoc}
*/
protected function getAuthUrl($state): string
{
$url = config('services.matrix.url').'/authorize';
return $this->buildAuthUrlFromBase($url, $state);
}
/**
* {@inheritdoc}
*/
protected function getTokenUrl(): string
{
return config('services.matrix.url').'/oauth2/token';
}
// Controller
public function redirect(Request $request)
{
// Get the necessary information.
// ...
config(['services.matrix.url' => $url]);
config(['services.matrix.client_id' => $client_id]);
config(['services.matrix.client_secret' => $client_secret]);
session(['matrix_url' => $url]);
//...
return Socialite::driver('matrix')->redirect();
}
public function callback(Request $request)
{
$url = session('matrix_url');
// ...
config(['services.matrix.url' => $url]);
config(['services.matrix.client_id' => $client_id]);
config(['services.matrix.client_secret' => $client_secret]);
$user = Socialite::driver('matrix')->user();
// ...
}