FOSOAuthServerBundle和自定义身份验证提供程序

时间:2015-10-27 17:35:53

标签: php symfony authentication oauth-2.0 fosoauthserverbundle

编辑:发现错误。 \vendor\friendsofsymfony\oauth-server-bundle\FOS\OAuthServerBundle\Resources\config\oauth.xml中的代码有一点点安静,其中说:

<argument type="service" id="fos_oauth_server.user_provider" on-invalid="null" />

所以当你在config.yml中的服务定义错误或只是一个错字(来自original docs

If you're authenticating users, don't forget to set the user provider. Here's an example using the FOSUserBundle user provider:

# app/config/config.yml
fos_oauth_server:
    ...

    service:
        user_provider: fos_user.user_manager
你迷路了。没有错误,没有警告,用户提供程序只是null。无论如何,感谢你阅读这篇文章。我将在github上讨论这个问题。

-

我正在使用FOSOAuthServerBundle构建OAuth2服务器。一切正常,只要我使用grant_type = password请求access_token并使用带有自定义UserProvider的form_login。

我的security.yml看起来像这样。

security:
    providers:
        webservice:
            id: webservice_user_provider

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        oauth_authorize:
            pattern:    ^/oauth/v2/auth
            form_login:
                provider: webservice
                check_path: login_check
                login_path: login
            anonymous: true

        oauth_token:
            pattern:    ^/oauth/v2/token
            security:   false

        api:
            pattern:    ^/api
            fos_oauth:  true
            stateless:  true

        default:
            anonymous: ~

            form_login:
                provider: webservice
                login_path: /login
                check_path: /login_check

            logout:
                path:   /logout
                target: /

        login:
            pattern:  ^/login$
            security: false

由于自定义用户提供商不足以满足我的需求,因此我在this Tutorial之后实施了自定义身份验证提供程序。当我尝试使用标准登录表单登录时,这个也正常工作。我将security.yml更改为

    oauth_authorize:
        pattern:    ^/oauth/v2/auth
        webservice-login:
            provider: webservice
            check_path: login_check
            login_path: /login
        anonymous: true

        webservice-login:
            check_path: login_check
            login_path: /login
            provider: webservice

webservice-login来自SecurityFactory

class SecurityFactory extends FormLoginFactory
{
    public function getKey()
    {
        return 'webservice-login';
    }

    protected function getListenerId()
    {
        return 'security.authentication.listener.form';
    }

    protected function createAuthProvider(ContainerBuilder $container, $id, $config, $userProviderId)
    {
        $provider = 'security.authentication_provider.als_webservice.'.$id;
        $container
            ->setDefinition($provider, new DefinitionDecorator('security.authentication_provider.als_webservice'))
            ->replaceArgument(1, new Reference($userProviderId))
            ->replaceArgument(3, $id)
        ;

        return $provider;
    }
}

当我现在尝试获取访问令牌时,我收到错误消息:错误:

Call to a member function loadUserByUsername() on a non-object in
vendor\friendsofsymfony\oauth-server-bundle\FOS\OAuthServerBundle\Storage\OAuthStorage.php at line 165.

基本上,UserProvider始终为null。

有人知道吗,我在这里做错了什么?我完全陷入困境,非常感谢任何帮助!

0 个答案:

没有答案