来自 Mirage 的失败身份验证请求(401 未经授权)总是在 ember-simple-auth-token 中解析
Failed authentification requests (401 Unauthorized) from mirage always resolves in ember-simple-auth-token
在我的 Ember 应用程序中,我有一个登录操作。
login: function(emailAddress, password) {
this.get('session').authenticate('authenticator:jwt', {
'identification': emailAddress,
'password': password
}).catch((reason) => {
console.log('Reason: ' + JSON.stringify(reason));
this.set('errorMessage', 'Login failed.');
});
}
当我用我的服务器 (http://127.0.0.1:8091) 测试时,它工作正常。当响应为 200 时,我已登录。如果为 401,则我的错误消息已设置。
ember-cli-mirage 出现问题。我有这个测试代码:
this.post('http://127.0.0.1:8091', function(db, req) {
let body = JSON.parse(req.requestBody);
if (body.handler === 'test@example.com!' && body.password === 'secretpassword') {
return {
token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImFiYzEyMyJ9.X0O3xMVikn-5l9gXBU5a2XF6vlMmTzm4mCqUNA68e-A',
id: 'abc123'
};
} else {
return new Response(401, {}, {});
}
});
我只是发送了一个测试令牌,它在凭据正确时起作用。我可以登录到我的应用程序。但是,如果我尝试使用错误的凭据,则会在我的 JS 控制台中收到此错误:
Uncaught TypeError: Cannot read property 'split' of undefined
经过一些调查,错误似乎发生在这段代码中调用的函数 getTokenData 中:
authenticate: function authenticate(credentials, headers) {
var _this2 = this;
return new _ember['default'].RSVP.Promise(function (resolve, reject) {
var data = _this2.getAuthenticateData(credentials);
_this2.makeRequest(_this2.serverTokenEndpoint, data, headers).then(function (response) {
_ember['default'].run(function () {
var token = _ember['default'].get(response, _this2.tokenPropertyName);
var tokenData = _this2.getTokenData(token);
var expiresAt = _ember['default'].get(tokenData, _this2.tokenExpireName);
var tokenExpireData = {};
_this2.scheduleAccessTokenRefresh(expiresAt, token);
tokenExpireData[_this2.tokenExpireName] = expiresAt;
response = _ember['default'].merge(response, tokenExpireData);
resolve(_this2.getResponseData(response));
});
}, function (xhr) {
_ember['default'].run(function () {
reject(xhr.responseJSON || xhr.responseText);
});
});
});
},
查看 var tokenData = _this2.getTokenData(token);
所在的行。既然请求被拒绝了,难道不应该调用第二个函数(rejected promise)吗?
看起来 ember-simple-auth-token 正在尝试使用一个不存在的令牌,因为响应是一个空的 401。我尝试在被拒绝的请求中包含一个令牌,但我仍然得到同样的错误。
Remember 当响应来自我的本地服务器(甚至我的真实服务器)时,它工作正常。
我找不到调试 Mirage 的方法。如何查看有关回复的详细信息?请求没有出现在我的浏览器的开发人员工具的“网络”选项卡下。
接下来我应该研究什么来解决这个问题?
使用 Mirage.Response
而不是 Response
解决了这个问题。通过使用 Response
,响应本身为空 ({}
),因此默认情况下 Mirage 会使其成为空的 200 OK。
在我的 Ember 应用程序中,我有一个登录操作。
login: function(emailAddress, password) {
this.get('session').authenticate('authenticator:jwt', {
'identification': emailAddress,
'password': password
}).catch((reason) => {
console.log('Reason: ' + JSON.stringify(reason));
this.set('errorMessage', 'Login failed.');
});
}
当我用我的服务器 (http://127.0.0.1:8091) 测试时,它工作正常。当响应为 200 时,我已登录。如果为 401,则我的错误消息已设置。
ember-cli-mirage 出现问题。我有这个测试代码:
this.post('http://127.0.0.1:8091', function(db, req) {
let body = JSON.parse(req.requestBody);
if (body.handler === 'test@example.com!' && body.password === 'secretpassword') {
return {
token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImFiYzEyMyJ9.X0O3xMVikn-5l9gXBU5a2XF6vlMmTzm4mCqUNA68e-A',
id: 'abc123'
};
} else {
return new Response(401, {}, {});
}
});
我只是发送了一个测试令牌,它在凭据正确时起作用。我可以登录到我的应用程序。但是,如果我尝试使用错误的凭据,则会在我的 JS 控制台中收到此错误:
Uncaught TypeError: Cannot read property 'split' of undefined
经过一些调查,错误似乎发生在这段代码中调用的函数 getTokenData 中:
authenticate: function authenticate(credentials, headers) {
var _this2 = this;
return new _ember['default'].RSVP.Promise(function (resolve, reject) {
var data = _this2.getAuthenticateData(credentials);
_this2.makeRequest(_this2.serverTokenEndpoint, data, headers).then(function (response) {
_ember['default'].run(function () {
var token = _ember['default'].get(response, _this2.tokenPropertyName);
var tokenData = _this2.getTokenData(token);
var expiresAt = _ember['default'].get(tokenData, _this2.tokenExpireName);
var tokenExpireData = {};
_this2.scheduleAccessTokenRefresh(expiresAt, token);
tokenExpireData[_this2.tokenExpireName] = expiresAt;
response = _ember['default'].merge(response, tokenExpireData);
resolve(_this2.getResponseData(response));
});
}, function (xhr) {
_ember['default'].run(function () {
reject(xhr.responseJSON || xhr.responseText);
});
});
});
},
查看 var tokenData = _this2.getTokenData(token);
所在的行。既然请求被拒绝了,难道不应该调用第二个函数(rejected promise)吗?
看起来 ember-simple-auth-token 正在尝试使用一个不存在的令牌,因为响应是一个空的 401。我尝试在被拒绝的请求中包含一个令牌,但我仍然得到同样的错误。
Remember 当响应来自我的本地服务器(甚至我的真实服务器)时,它工作正常。
我找不到调试 Mirage 的方法。如何查看有关回复的详细信息?请求没有出现在我的浏览器的开发人员工具的“网络”选项卡下。
接下来我应该研究什么来解决这个问题?
使用 Mirage.Response
而不是 Response
解决了这个问题。通过使用 Response
,响应本身为空 ({}
),因此默认情况下 Mirage 会使其成为空的 200 OK。