Symfony API Rest登录并注册

时间:2018-03-12 14:52:11

标签: fosuserbundle fosrestbundle symfony-3.4 fosoauthserverbundle

我正在使用FOSUserBundle,FOSResBundle和FOSoAuthBundle完成使用公共端点开发API休息。

与此同时,我正在开发另一个symfony应用程序来使用这些服务,但我对如何通过API端点注册和登录用户有几个疑问。我的想法是让2个控制器引用它的路由(例如/ login和/ register)并通过api端点执行此操作。

使用FOSUserbundle这个动作很简单,但不知道如何消费'通过APIRest服务。

1 个答案:

答案 0 :(得分:2)

我知道它只有答案的一半,但我目前通过登录进行此操作,但没有注册(我不需要)。

我正在使用Symfony 4和flex,但我认为它应该适用于3.4。我也在使用json。

捆绑

我使用的捆绑包(在fosuser等之上):

  • JMS /串行束
  • lexik / JWT认证束
  • friendsofsymfony /休息束

配置

Fos Rest

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用户

fos_user:
    db_driver: orm 
    firewall_name: api 
    user_class: App\Entity\User
    from_email:
        address: admin@example.com
        sender_name: Admin

JMS Serializer

jms_serializer:
    visitors:
        xml:
            format_output: '%kernel.debug%'

Lexik JWT

您需要生成令牌并将其位置放在.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.yaml

中打开注册路线
security:
    firewalls:
        api_register:
            pattern: ^/register
            anonymous: true

    access_control:
        - { path: ^/register$,        role: IS_AUTHENTICATED_ANONYMOUSLY }

注册路线

registration:
    type: rest
    resource: App\Controller\RegistrationController

编写控制器方法

  1. 获取请求数据
  2. 使用FosUserManager创建新用户      - https://symfony.com/doc/current/bundles/FOSUserBundle/user_manager.html