php 在Symfony项目中使用HWI OAuth捆绑包的多个客户端具有不同的SSO配置

rggaifut  于 2023-06-20  发布在  PHP
关注(0)|答案(2)|浏览(107)

我已经在数据库中实现了资源所有者管理。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类型的资源所有者。

tag5nh1u

tag5nh1u1#

否则,另一种解决方案是根据客户端加载不同的YAML文件。我将研究这个选项。

9jyewag0

9jyewag02#

我尝试为Google check-path设置多个Google资源所有者,但遇到此错误:路径“security.firewalls.main.oauth.resource_owners”的配置无效:每个资源所有者都应该有一个唯一的'check_path'。
security.yml

main:
            pattern: ^/
            stateless: true
            lazy: true
            provider: my_provider
            jwt: ~
            custom_authenticators:
                - App\Security\ApiKeyAuthenticator
            oauth:
                resource_owners:
                    Second: "/check-google"
                    First: "/check-google"
                login_path: /login
                use_forward: false
                failure_path: /login
                success_handler: App\Security\OAuthSuccessHandler
                oauth_user_provider:
                    service: App\Provider\SSOUserProvider

配置

hwi_oauth:
    firewall_names:
        - main
    resource_owners:
        Second:
            type: google
            client_id: test
            client_secret: test
        Premier:
            type: google
            client_id: toto
            client_secret: toto

相关问题