我正在使用FOSUserBundle,FOSResBundle和FOSoAuthBundle完成使用公共端点开发API休息。
与此同时,我正在开发另一个symfony应用程序来使用这些服务,但我对如何通过API端点注册和登录用户有几个疑问。我的想法是让2个控制器引用它的路由(例如/ login和/ register)并通过api端点执行此操作。
使用FOSUserbundle这个动作很简单,但不知道如何消费'通过APIRest服务。
答案 0 :(得分:2)
我知道它只有答案的一半,但我目前通过登录进行此操作,但没有注册(我不需要)。
我正在使用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: admin@example.com
sender_name: Admin
jms_serializer:
visitors:
xml:
format_output: '%kernel.debug%'
您需要生成令牌并将其位置放在.env
文件中。 More info and a guide here.
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');
}
}
你可以向/login
发出一个POST请求,它应该返回一个令牌!
{
"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