Symfony 3 FOS Rest返回登录页面

时间:2018-01-24 06:14:59

标签: php rest symfony

我有一个symfony网络应用程序。我想为我的网络应用添加功能,这是一个非常好的API。

如此安静的api和web应用程序,在一个Web应用程序/项目中运行。

我终于成功设置了API和Web规则,但问题是如果我在浏览器中访问,它将返回登录页面,我需要登录1st。没问题,问题是,当我在邮递员或客户端应用程序中测试时。客户端无法获取数据,因为它返回登录页面。

这是我的config.yml:

# Nelmio CORS Configuration
nelmio_cors:
    defaults:
        allow_credentials: false
        allow_origin: ['*']
        allow_headers: ['*']
        allow_methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS']
        max_age: 3600
        hosts: []
        origin_regex: false

# FOSRest Configuration
fos_rest:
    body_listener: true
    format_listener:
        rules:
            - { path: '^/api', priorities: ['json'], fallback_format: json, prefer_extension: false }
            - { path: '^/', priorities: ['text/html', '*/*'], fallback_format: html, prefer_extension: true }
    param_fetcher_listener: true
    view:
        view_response_listener: 'force'
        formats:
            json: true

这是我的security.yml

# To get started with security, check out the documentation:
# https://symfony.com/doc/current/security.html
security:
    encoders:
        AppBundle\Entity\User:
            algorithm: bcrypt
    # https://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded
    providers:
        db_provider:
            entity:
                class: AppBundle\Entity\User

    firewalls:
        # disables authentication for assets and the profiler, adapt it according to your needs
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        main:
            anonymous: ~
            form_login: 
                login_path: login
                check_path: login
            logout:
                path: /logout
                target: /
            # activate different ways to authenticate

            # https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate
            #http_basic: ~

            # https://symfony.com/doc/current/security/form_login_setup.html
            #form_login: ~
    access_control:
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/local_registration, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/, roles: IS_AUTHENTICATED_FULLY }

这是我的控制者:

<?php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\Controller\FOSRestController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use FOS\RestBundle\View\View;
use AppBundle\Entity\User;

class DemoController extends FOSRestController
{

    /**
     * @Rest\Get("/api/demo")
     */
    public function getAction()
    {
        $data = array("hello" => "world");
        // $view = $this->view($data);
        return $data;
    }
}

问题 现在,当我使用浏览器获取localhost:8000 / api / demo时,我只需登录并获取JSON中的数据,但是当我使用邮递员访问时,返回的是登录页面HTML

如何使用api登录?或者不返回登录页面,但仍然经过身份验证

2 个答案:

答案 0 :(得分:0)

看起来你的Symfony用会话cookie检索用户的会话。 因此,当您从浏览器调用API时,您已经过身份验证。

但是在Postman中,默认情况下不会从谷歌浏览器共享cookie(是的,你必须使用谷歌浏览器和邮递员),因为你必须激活邮递员拦截器。之后,邮递员将在给定域名中使用与Google Chrome相同的Cookie进行HTTP调用。

一个好的(和开源的)http客户端是失眠,你可能想尝试一下:D

答案 1 :(得分:0)

您需要为应用的其余部分使用其他一些身份验证系统。 LexikJWTAuthenticationBundle可能是不错的选择。

通常,您会使用Authentication神秘令牌向您的请求添加Bearer标头,然后让捆绑执行其余操作。