LexikJWTAuthenticationBundle with ionic app

时间:2016-04-29 08:51:20

标签: authentication ionic-framework symfony fosrestbundle lexikjwtauthbundle

我已经看过很多关于这个主题的帖子,但无论我的测试是什么,我都无法提出正确的要求。 我希望有人能帮助我。

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

我在我的vhost中添加了所有重写规则:

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

在客户端,我使用离子与角度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 -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"

我搜索解决方案,使用angular http object

复制此请求

编辑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请求时,我可以获取我的令牌。当我使用角度/离子应用程序时,我有错误: 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:在LexikJWTAuthenticationBundleSandbox中使用哪个版本的角度演示应用?

1 个答案:

答案 0 :(得分:0)

在第一个(工作)请求中,您使用_username作为字段值"用户名"和_password作为有价值的字段"传递"。

在第二个中,您使用username(而不是_username)作为带有值的字段" user"和password(而不是_password)作为值为#34的字段;传递"。

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

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请求之前,尝试在角度应用程序中添加以下内容:

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(...))。