我已经看过很多关于这个主题的帖子,但无论我的测试是什么,我都无法提出正确的要求。 我希望有人能帮助我。
我目前的配置: 我使用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中使用哪个版本的角度演示应用?
答案 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(...)
)。