Symfony 4 Успешный вход в API через JWT и Facebook - PullRequest
1 голос
/ 18 января 2020

У меня есть вопрос относительно аутентификации с помощью JWT и Facebook для успокоительного приложения API.

Я использую Symfony 4 и для аутентификации "lexik / jwt-authentication-bundle": "^ 2.6", для генерации токенов jwt на основе имени пользователя и пароля.

Вот моя конфигурация security.yaml:

security:
    encoders:
        App\Entity\User: bcrypt
    providers:
        database:
            entity:
                class: App\Entity\User
                property: username
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        login:
            pattern: ^/api/login
            stateless: true
            anonymous: true
            json_login:
                check_path: /api/login
                success_handler: lexik_jwt_authentication.handler.authentication_success
                failure_handler: lexik_jwt_authentication.handler.authentication_failure

        register:
            pattern: ^/api/register
            anonymous: true
            methods: [POST]

        docs:
            pattern:  ^/api/docs
            anonymous: true
            methods: [GET]

        api:
            pattern: ^/api
            stateless: true
            guard:
                authenticators:
                    - lexik_jwt_authentication.jwt_token_authenticator
    access_control:
        - { path: ^/api/docs, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/api/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/api/register, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/api/profile/social-account, roles: ROLE_INFLUENCER }
        - { path: ^/api, roles: IS_AUTHENTICATED_FULLY }

Я пытаюсь добавить также логин через Facebook, но не знаю, как с этим справиться что с JWT, как я хочу вернуть после входа в систему токен JWT.

Есть ли способ обработки входа в Facebook и JWT?

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Хорошую идею о том, как это реализовать, вы можете получить здесь: https://github.com/lexik/LexikJWTAuthenticationBundle/issues/295.

В основном после того, как пользователь примет логин Facebook на вашем веб-интерфейсе:

  • отправьте запрос POST с токеном пользователя на пользовательскую конечную точку (например, login/facebook.

  • Затем вы можете сделать дополнительный запрос с помощью токен пользователя на Facebook api для получения дополнительной информации в виде имени, фамилии или электронной почты пользователя (например, с https://graph.facebook.com/me/?fields=first_name,last_name,email). Токен должен иметь правильные разрешения для доступа к этой информации (https://developers.facebook.com/docs/facebook-login/permissions/overview).

  • Теперь вы можете создать пользователя, если адрес электронной почты отсутствует в вашей базе данных. Наконец, просто верните token с create методом JWTManager класса.

$token = $this->jwtManager->create($user);

С помощью этой логики c для вашего веб-интерфейса полностью прозрачно, выполнил ли ваш пользователь вход в приложение или нет, и он получает токен так же, как пользователь получит ваша /login конечная точка.

0 голосов
/ 04 мая 2020

Я предполагаю, что у вас есть приложение внешнего интерфейса (React / Angular / Vue ...), которое использует ваш API.

Я бы обработал "вход через Facebook" на Сторона интерфейса. После того, как пользователь примет аутентификацию через Facebook, он будет отправлен обратно в ваше веб-приложение. В этот момент у вас есть доступ ко всей необходимой вам информации (например, электронная почта, имя, фамилия и т. Д. c).

ПОСТАВЬТЕ эту информацию в новую конечную точку (например, / api / facebook- login), который обрабатывает вашу регистрацию и / или процесс входа в систему, а затем возвращает токен JWT вашему вновь созданному пользователю. Lexik позволяет создавать токены вручную:

class ApiController extends Controller
{
    public function getTokenUser(UserInterface $user, JWTTokenManagerInterface $JWTManager)
    {
        // ...

        return new JsonResponse(['token' => $JWTManager->create($user)]);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...