我已经在数据库中实现了资源所有者管理。hwi_oauth.yaml文件中存在相同的资源所有者,因此我可以直接使用它们。但是,我正面临着一个困难。例如,我想使用资源所有者的名称重定向到Google身份验证页面。这部分工作正常。当我登录时出现了这个问题,因为我没有通过我的OAuthSuccessHandler服务。相反,我被重定向到/login,正如您在failure_path下的security.yaml文件中看到的那样。
/**
* @ORM\Column(type="string", unique=true)
*/
private string $name;
/**
* @ORM\Column(type="string")
* @Assert\Choice({"google", "azure"})
*/
private string $provider;
/**
* @ORM\Column(type="string")
*/
private string $clientId;
/**
* @ORM\Column(type="string")
*/
private string $clientSecret;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Client", inversedBy="resourceOwners")
* @ORM\JoinColumn(nullable=false)
*/
private Client $client;
security.yaml
oauth:
pattern: ^/(connect|login)
stateless: false
main:
pattern: ^/
stateless: true
lazy: true
provider: my_provider
jwt: ~
custom_authenticators:
- App\Security\ApiKeyAuthenticator
oauth:
resource_owners:
azure: "/check-azure"
google: "/check-google"
login_path: /login
use_forward: false
failure_path: /login
success_handler: App\Security\OAuthSuccessHandler
oauth_user_provider:
service: App\Provider\SSOUserProvider
access_control:
- { path: '^/$', roles: [ IS_AUTHENTICATED_ANONYMOUSLY ] }
- { path: '^/login', roles: [ IS_AUTHENTICATED_ANONYMOUSLY ] }
- { path: '^/login/{authProviderName}', roles: [ IS_AUTHENTICATED_ANONYMOUSLY ] }
- { path: '^/connect', roles: [ IS_AUTHENTICATED_FULLY ] }
我的路由允许基于资源所有者的名称重定向,然后重定向到适当的提供者(它是为Google测试而硬编码的,但其想法是使其通用):
final class OAuthController extends AbstractController
{
/**
* @Route("/login/{authProviderName}", name="login_redirect_to_provider")
*/
public function redirectToProvider(AuthProviderRepository $authProviderRepository, string $authProviderName)
{
if (!$authProvider = $authProviderRepository->findOneByName($authProviderName)) {
throw new AuthProviderNotFoundException();
}
$clientId = $authProvider->getClientId();
$provider = $authProvider->getProvider();
$redirectUrl = "http://project-sf/check-$provider";
$authUrl = 'https://accounts.google.com/o/oauth2/auth/oauthchooseaccount?response_type=code&client_id='.$clientId.'&scope=openid%20email%20profile&redirect_uri=' . urlencode($redirectUrl) . '&service=lso&o2v=1&flowName=GeneralOAuthFlow';
return new RedirectResponse($authUrl);
}
}
hwi_oauth_connect:
resource: "@HWIOAuthBundle/Resources/config/routing/connect.xml"
prefix: /connect
hwi_oauth_login:
resource: "@HWIOAuthBundle/Resources/config/routing/login.xml"
prefix: /login
google_login:
path: /check-google
controller: HWI\Bundle\OAuthBundle\Controller\RedirectToServiceController::redirectToServiceAction
azure_login:
path: /check-azure
controller: HWI\Bundle\OAuthBundle\Controller\RedirectToServiceController::redirectToServiceAction
该捆绑包允许将名称分配给资源所有者,但之后不能用于重定向到正确的提供者。我需要在登录URL中指定提供商的名称,例如/login/google或/login/azure。我想要的是/login/authproviderName,并使用正确的client_id重定向到相关提供者的身份验证,在这种情况下,我有两个Google类型的资源所有者。
2条答案
按热度按时间tag5nh1u1#
否则,另一种解决方案是根据客户端加载不同的YAML文件。我将研究这个选项。
9jyewag02#
我尝试为Google check-path设置多个Google资源所有者,但遇到此错误:路径“security.firewalls.main.oauth.resource_owners”的配置无效:每个资源所有者都应该有一个唯一的'check_path'。
security.yml
配置