Я заканчиваю разработку API-интерфейса с общими конечными точками с использованием FOSUserBundle, FOSResBundle и FOSoAuthBundle.
Параллельно я разрабатываю другое приложение symfony для использования сервисов, но у меня есть несколько сомнений в том, как регистрировать и входить в систему пользователей через конечные точки API. Моя идея состоит в том, чтобы 2 контроллера ссылались на его маршруты (например, / login и / register) и выполняли эти действия через конечную точку api.
с FOSUserbundle эти действия просты, но они не знают, как «потреблять» через службу APIRest.





Я знаю, что это только половина ответа, но в настоящее время я делаю это с логином, но не с регистрацией (мне это не нужно).
Я использую Symfony 4 и flex, но думаю, он должен работать на 3.4. Я также использую json.
Пакеты, которые я использую для этого (поверх fosuser и т. д.):
fos_rest:
body_listener: true
param_fetcher_listener: force
format_listener:
enabled: true
rules:
- { path: ^/, priorities: [ json ], fallback_format: json, prefer_extension: true }
view:
view_response_listener: 'force'
formats:
json: true
xml: false
rss: false
mime_types:
json: ['application/json', 'application/x-json']
routing_loader:
default_format: json
include_format: false
exception:
enabled: true
fos_user:
db_driver: orm
firewall_name: api
user_class: App\Entity\User
from_email:
address: [email protected]
sender_name: Admin
jms_serializer:
visitors:
xml:
format_output: '%kernel.debug%'
Вам нужно сгенерировать токены и указать их местоположение в файле .env. Дополнительная информация и руководство здесь.
lexik_jwt_authentication:
private_key_path: '%kernel.project_dir%/%env(JWT_PRIVATE_KEY_PATH)%'
public_key_path: '%kernel.project_dir%/%env(JWT_PUBLIC_KEY_PATH)%'
pass_phrase: '%env(JWT_PASSPHRASE)%'
token_ttl: 3600 #whatever you like
token_extractors:
authorization_header: ~
cookie: ~
query_parameter: ~
security:
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
encoders:
FOS\UserBundle\Model\UserInterface: sha512 #probably use bcrypt
providers:
fos_userbundle:
id: fos_user.user_provider.username_email
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
api_login:
pattern: ^/login
stateless: true
anonymous: true
form_login:
check_path: /login
require_previous_session: false
username_parameter: username
password_parameter: password
success_handler: lexik_jwt_authentication.handler.authentication_success
failure_handler: lexik_jwt_authentication.handler.authentication_failure
api:
pattern: ^/
stateless: true
guard:
authenticators:
- lexik_jwt_authentication.jwt_token_authenticator
access_control:
- { path: ^/, role: IS_AUTHENTICATED_FULLY }
login:
type: rest
resource: App\Controller\LoginController
Я сделал loginController, который на самом деле является просто заполнителем для переопределения маршрута
<?php
namespace App\Controller;
use FOS\RestBundle\Controller\Annotations;
use FOS\RestBundle\Controller\FOSRestController;
use FOS\RestBundle\Routing\ClassResourceInterface;
use FOS\RestBundle\Controller\Annotations\RouteResource;
/**
* @RouteResource("login", pluralize=false)
*/
class LoginController extends FOSRestController implements ClassResourceInterface
{
public function postAction()
{
throw new \DomainException('You should never see this');
}
}
Вы можете отправить запрос POST на /login, и он должен вернуть токен!
{
"username": "my_user",
"password": "passw0rd"
}
На самом деле я этого не делал, но у меня есть достаточно простая идея ...
security:
firewalls:
api_register:
pattern: ^/register
anonymous: true
access_control:
- { path: ^/register$, role: IS_AUTHENTICATED_ANONYMOUSLY }
registration:
type: rest
resource: App\Controller\RegistrationController