我正在构建一个带有Node后端的Ember应用程序。我正在尝试实现JWT身份验证系统并且还安装了Ember简单身份验证,但是当我尝试使用已保存在服务器中的凭据提交表单时,我收到错误消息:无法发布/会话/创建任何想法如何解决这个问题?
这是我的Ember身份验证码:
import Ember from 'ember';
import Base from 'simple-auth/authenticators/base';
export default Base.extend({
tokenEndpoint: 'http://localhost:8080/sessions/create',
restore: function(data) {
return new Ember.RSVP.Promise(function(resolve, reject) {
if (!Ember.isEmpty(data.token)) {
resolve(data);
} else {
reject();
}
});
},
authenticate: function(options) {
return new Ember.RSVP.Promise((resolve, reject) => {
Ember.$.ajax({
url: this.tokenEndpoint,
type: 'POST',
data: JSON.stringify({
username: options.identification,
password: options.password
}),
contentType: 'application/json;charset=utf-8',
dataType: 'json'
}).then(function(response) {
Ember.run(function() {
resolve({
token: response.id_token
});
});
}, function(xhr, status, error) {
var response = xhr.responseText;
Ember.run(function() {
reject(response);
});
});
});
},
invalidate: function() {
console.log('invalidate...');
return Ember.RSVP.resolve();
}
});
这是我的Ember授权人代码:
import Ember from 'ember';
import Base from 'simple-auth/authorizers/base';
export default Base.extend({
authorize: function(jqXHR, requestOptions) {
var accessToken = this.get('session.content.secure.token');
if (this.get('session.isAuthenticated') && !Ember.isEmpty(accessToken)) {
jqXHR.setRequestHeader('Authorization', 'Bearer ' + accessToken);
}
}
});
以下是来自Node服务器的代码:
var express = require('express'),
_ = require('lodash'),
config = require('./config'),
jwt = require('jsonwebtoken');
var app = module.exports = express.Router();
// XXX: This should be a database of users :).
var users = [{
id: 1,
username: 'gonto',
password: 'gonto'
}];
function createToken(user) {
return jwt.sign(_.omit(user, 'password'), config.secret, { expiresInMinutes: 60*5 });
}
app.post('/users', function(req, res) {
if (!req.body.username || !req.body.password) {
return res.status(400).send("You must send the username and the password");
}
if (_.find(users, {username: req.body.username})) {
return res.status(400).send("A user with that username already exists");
}
var profile = _.pick(req.body, 'username', 'password', 'extra');
profile.id = _.max(users, 'id').id + 1;
users.push(profile);
res.status(201).send({
id_token: createToken(profile)
});
});
app.post('/sessions/create', function(req, res) {
if (!req.body.username || !req.body.password) {
return res.status(400).send("You must send the username and the password");
}
var user = _.find(users, {username: req.body.username});
if (!user) {
return res.status(401).send("The username or password don't match");
}
if (user.password !== req.body.password) {
return res.status(401).send("The username or password don't match");
}
res.status(201).send({
id_token: createToken(user)
});
});