Пользовательский провайдер HWIOAuthBundle не будет входить в систему - PullRequest
0 голосов
/ 30 июня 2018

Я использую HWIOAuthBundle с Symfony 4.1.

Мой пользовательский провайдер получает вызов и возвращает действительного пользователя, однако после перенаправления пользователь не вошел в систему. Веб-профилировщик показывает: вошли как anon; анонимный токен; Основной брандмауэр

Я упростил приведенный ниже класс провайдера для краткости, и сейчас он рассматривает только твиттер. Условия около $source, поэтому я могу добавить больше позже.

Я использовал xdebug, чтобы убедиться, что вызывается loadUserByOauthuserResponse(), и что оба пользователя создаются в случае нового пользователя, или существующий пользователь возвращается, когда он существует.

Вопрос: Если loadUserbyOauthUserResponse() возвращает действительный пользовательский объект, то что может помешать ему создать действительный сеанс с этим пользователем?

<?php

namespace App\Security;

...

class OAuthProvider extends OAuthUserProvider
{
   ...
    public function loadUserByOAuthUserResponse(UserResponseInterface $response): User
    {
        /** @var EntityManager $em */
        $em = $this->container->get('doctrine.orm.entity_manager');
        $repo = $em->getRepository('App:User');

        $source = $response->getResourceOwner()->getName();
        $email = null;
        $data = [];
        $newUser = false;

        // Set email and socialUser.
        if ($source === 'twitter') {
            $data = $response->getData();
            $email = $data['email'];
        }

        // Check if this user already exists in our app.
        $user = $repo->findOneBy(['email' => $email]);

        if ($user === null) {
            $newUser = true;
            $user = new User();
            $user->setPassword($this->strand(32));
        }

        // Set session and user data based on source.
        if ($source === 'twitter') {
            $name = $data['name'];
            if ($newUser) {
                $user->setNickName($name);
                $user->setEmail($email);
                $em->persist($user);
                $em->flush();
            }
        }

        return $user;
    }
}

hwi_oauth.yaml

hwi_oauth:
    # list of names of the firewalls in which this bundle is active, this setting MUST be set
    firewall_names: [main]

    # https://github.com/hwi/HWIOAuthBundle/blob/master/Resources/doc/2-configuring_resource_owners.md
    resource_owners:
        twitter:
            type:                twitter
            client_id:           '%env(TWITTER_ID)%'
            client_secret:       '%env(TWITTER_SECRET)%'
            options:
                include_email: true

services.yaml:

app.oauth_aware.user_provider.service:
    class: App\Security\OAuthProvider
    arguments: ['@service_container']

security.yaml:

security:
    # https://symfony.com/doc/current/book/security.html#where-do-users-come-from-user-providers
    encoders:
        App\Entity\User: bcrypt
    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN
    providers:
        app_users:
            entity: { class: App\Entity\User, property: email }
        hwi:
            id: app.oauth_aware.user_provider.service
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            provider: app_users
            anonymous: ~
            remember_me:
                secret: "%env(APP_SECRET)%"
                lifetime: 2592000
                path:  /
            guard:
                authenticators:
                    - App\Security\LoginFormAuthenticator
                entry_point: App\Security\LoginFormAuthenticator
            logout:
                path: /logout
                target: /
            oauth:
                resource_owners:
                    twitter: "/login/check-twitter"
                default_target_path: /
                login_path: /
                failure_path: /user-login
                oauth_user_provider:
                    service: app.oauth_aware.user_provider.service
            switch_user: ~

    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/recover, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/, role: ROLE_ADMIN }

1 Ответ

0 голосов
/ 24 августа 2018

У меня была такая же проблема, пока я не нашел в журналах "Токен был деаутентифицирован после попытки его обновить". И после этого я нашел это решение. Токен был деаутентифицирован после попытки его обновления

Я добавил isEqualTo и не вышел из системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...