4

编辑:发现错误。代码中有一点点和平,\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 中的服务定义错误或只是拼写错误时(来自原始文档

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

你迷路了。没有错误,没有警告,用户提供者只是空的。无论如何,感谢您阅读这篇文章。我会在 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

由于自定义用户提供程序不足以满足我的需求,因此我按照本教程实现了自定义身份验证提供程序。当我尝试使用标准登录表单登录时,这个也可以正常工作。我将 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 始终为空。

有谁知道,我在这里做错了什么?我完全被卡住了,非常感谢任何帮助!

4

0 回答 0