我看过很多关于这个主题的帖子,但我无法提出正确的请求,不管我的所有测试。我希望有人能在这方面帮助我。
我当前的配置:我使用 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 中的演示应用程序一起使用?