1

我看过很多关于这个主题的帖子,但我无法提出正确的请求,不管我的所有测试。我希望有人能在这方面帮助我。

我当前的配置:我使用 wamp - apache 2.4.9 -- php 5.5.12 我使用 symfony3

我在我的虚拟主机中添加了所有重写规则:

RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.)
RewriteRule . - [e=HTTP_AUTHORIZATION:%1]

在后端,我的 security.yml 是:

firewalls:

        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        api_doc:
            pattern: ^/api/doc
            anonymous: true

        api_login:
            pattern:  ^/api/login
            provider: fos_userbundle
            stateless: true
            anonymous: true
            form_login:
                check_path:     /api/login_check
                require_previous_session: false
                success_handler:          lexik_jwt_authentication.handler.authentication_success
                failure_handler:          lexik_jwt_authentication.handler.authentication_failure

        api:
            pattern:   ^/api
            stateless: true
            provider: fos_userbundle
            lexik_jwt:
                authorization_header:
                    enabled: true
                    prefix:  Bearer
                query_parameter:
                    enabled: true
                    name:    Bearer
                throw_exceptions:        true
                create_entry_point:      true

fosuserbundle 的配置:

fos_user:
    db_driver: orm
    firewall_name: main
    user_class: UserBundle\Entity\User
    group:
        group_class: UserBundle\Entity\Group
        form:
            type: UserBundle\Form\Type\GroupFormType
    profile:
        form:
            type: UserBundle\Form\Type\ProfileFormType

在客户端方面,我将 ionic 与 angular js 一起使用,并尝试通过以下方式获取令牌:

 var loginData = {
                username: this.login.username,
                password: this.login.password
            };

            console.debug(loginData);

            $http({
                url: 'http://app.local/app_dev.php/api/login_check',
                method: 'POST',
                data: loginData,
                headers: {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'},
                ignoreAuthModule: true
            })
                .success(function (data) {
                    console.log("Success -- login ok with ".data);
                    $scope.token = data;
                })
                .error(function (data) {
                    console.log("ERROR -- login fail with ", data);
                    $scope.token = data;
                });

那总是给我“坏凭据”

但是我对 curl 的测试给我发送了一个令牌

curl -X POST http://app.local/api/login_check -d _username=username -d _password=pass

我有测试前缀_我的登录数据,更改配置

如果有人有想法?


编辑 :

也许我发现了我的问题。

此请求 curl 工作正常:

curl -X POST http://app.local/api/login_check -d _username=username -d _password=pass

但这一个不起作用:

 curl -X POST http://app.local/app_dev.php/api/login_check -d '{"username": "user", "password": "pass"}'

我搜索了一种解决方案来解决它,但我猜角度 http 方法无法发送两个参数


编辑 2:此请求工作正常:

curl -X POST http://app.local/app_dev.php/api/login_check -d '{"_username": "user", "_password": "pass"}' -H "Content-Type: application/json"

我搜索了一个解决方案来复制这个带有角度 http 对象的请求


编辑 3:

我提出这样的角度要求:

var loginData = {
                _username: this.login.username,
                _password: this.login.password
            };
            $http({
                url: 'http://app.local/app_dev.php/api/login_check',
                method: 'POST',
                data: loginData,
                headers: {'Content-Type': 'application/json'}
            })
                .success(function (data) {
                    console.log("Success -- login ok with ".data);
                })
                .error(function (error) {
                    console.log("ERROR -- login fail with ", error);
                });

我的 javascript 控制台打印一个错误:

XMLHttpRequest cannot load http://app.local/app_dev.php/api/login_check. Response for preflight has invalid HTTP status code 404

编辑 4:

我没有找到解决方案...

看来CORS请求是问题所在。我尝试在我的移动应用程序中重置所有标题,没有任何改变。我尝试安装 nelmioCorsBundle 以授权 OPTIONS 标头并控制我的配置,没有任何改变

我已经安装了沙箱(https://github.com/slashfan/LexikJWTAuthenticationBundleSandbox)并且我遇到了完全相同的问题。

当我尝试执行 curl 请求时,我可以获得我的令牌。当我使用 angular/ionic 应用程序时,出现错误: https ://github.com/slashfan/LexikJWTAuthenticationBundleSandbox

XMLHttpRequest cannot load http://app.local/app_dev.php/api/login_check. Response to preflight request doesn't pass access control check: The 'Access-Control-Allow-Origin' header contains multiple values '*, http://localhost:8100', but only one is allowed. Origin 'http://localhost:8100' is therefore not allowed access.

如果有人有新想法?我不知道我现在可以测试什么:s

PS:哪个版本的 Angular 与 LexikJWTAuthenticationBundleSandbox 中的演示应用程序一起使用?

4

1 回答 1

0

在第一个(工作)请求中,您使用_username值为“username”_password的字段和值为“pass”的字段。

在第二个中,您使用username(而不是_username)作为值为“user”的字段和password(而不是_password)作为值为“pass”的字段。

将您的第二个请求更改为:

curl -X POST http://app.local/app_dev.php/api/login_check -d '{"_username": "username", "_password": "pass"}'

它应该工作。

编辑

添加选项-H "Content-Type: application/json,它给出:

curl -X POST http://app.local/app_dev.php/api/login_check  -H "Content-Type: application/json" -d '{"_username": "username", "_password": "pass"}'

它应该工作!

编辑

这似乎是与 CORS 相关的问题。
在执行 POST 请求之前,尝试在您的 Angular 应用程序中添加以下内容:

app.config(function ($httpProvider) {
    $httpProvider.defaults.headers.common = {};
    $httpProvider.defaults.headers.post = {};
    $httpProvider.defaults.headers.put = {};
    $httpProvider.defaults.headers.patch = {};
});

app 是您的角度模块(即var app = angular.module(...))。

于 2016-04-29T10:59:08.523 回答