Это очень широкий вопрос, но недавно я прошел через все это, я верю, что могу дать подробный ответ о том, как Я внедрил. Это ключ, потому что есть очень много вариантов, и если вы посмотрите на большинство учебных пособий, они в основном фокусируются вокруг, используя rails
в качестве заднего конца вместо node
или express.js
. Я отвечу на этот вопрос, основываясь на том, что вы используете express.js
.
Я предваряю это, помня, что ember-data
- это совершенно другое ответвление ember, которое вы можете обойти и полностью не использовать, если вы чувствуете, что ваш проект не будет нуждаться в функциях с ним и вместо этого просто использовать запросы AJAX. ember-data
добавляет много сложности и накладных расходов к первоначальному началу проекта. Дополнительно TLS/SSL - самая важная защита, которую вы можете иметь и без нее, любая попытка безопасности за пределами этого недействительна без нее. Теперь, когда это не в порядке, давайте перейдем к сложной части его настройки.
По умолчанию ember-data
использует JSONAPIAdapter
, который основан на JSON API specification. Ваш Express.js
сервер API будет иметь, чтобы быть в состоянии функционировать в этой спецификации, если вы используете по умолчанию Adapter
без каких-либо Serializer
изменения
Разорвать проект из в основных компонентов, и что они должны делать, и варианты есть (с тем, что я сделал жирным шрифтом):
- Экспресс.JS API сервера
- Экспресс API маршруты библиотека
- Authentication
- Паспорт является хорошо работает для
express.js
- Пользовательские
механизм
- Authentication
- Токен Based
- Cookie На основе
- Data Modeling
- ember.js на основе веб-сервер
- адаптера (это касается передачи/приема данных и обработок ошибок)
- применения.JS: настроить адаптер для всего приложения
- Serializer (это касается внесения данных от адаптера Ember полезной)
- Не требуется по умолчанию
- Authenticator (это
ember-simple-auth
хорошо работает
- Оставьте свой собственный: example
- Authorizer
ember-simple-auth-token
дает вам скомпилированную Authorizer с использованием токена проверки подлинности на основе
- Database
- MongoDB (док-не на основе реляционных баз данных)
- Redis (в памяти нереляционных данных аза)
- MySQL (реляционная база данных)
- PostGreSQL (реляционная база данных)
- Другое
Основной поток выглядит следующим образом:
- Пользователь пытается войти in on ember.js app
- Ember.js использует aut henticator запросить доступ с сервера API
- сервер API проверяет пользователя и возвращает веб-токен JSON в заголовке
- ember.js использует Authorizer и добавляет веб-токен JSON в заголовок для будущего API запрашивает
- API вызов сделан к API сервер от Ember через адаптер с заголовком Authorizer
- сервер API проверяет токен и выполняет поиск требуемых данных
- сервера API отвечает с данными в формате JSON спецификации API формате
- ember.js адаптер принимает данные и обрабатывает ответ
- ember.js сериализатору принимает данные от адаптера и делает его можно было использовать на Эмбер
- Ember данных получает данные модели из сериализатором и сохраняет его в кэше
- данных модели заполняется на основе шаблонов и контроллеров на Эмбер.JS страницы
Вот как я поставил его
** Установка Ember.js
на использование Express.js
API сервера **
Установите следующие пункты для уголек-кли:
ember install ember-simple-auth
- Для аутентификация
ember install ember-simple-auth-token
- для аутентификации на основе токенов
в app/adapters/application.js
:
import DS from 'ember-data';
import DataAdapterMixin from 'ember-simple-auth/mixins/data-adapter-mixin'; // Authenticating data from the API server
import Ember from 'ember';
import ENV from '../config/environment';
export default DS.JSONAPIAdapter.extend(DataAdapterMixin,{
authManager: Ember.inject.service('session'),
host: ENV.apihost, // location of the API server
namespace: ENV.apinamespace, // Namespace of API server ie: 'api/v1'
authorizer: 'authorizer:token', // Authorizer to use for authentication
ajax: function(url, method, hash) {
hash = hash || {}; // hash may be undefined
hash.crossDomain = true; // Needed for CORS
return this._super(url, method, hash);
}
});
В config/environment.js
:
ENV.host = 'http://localhost:4000'; /* this assumes the express.js server
is running on port 4000 locally, in a production environment it would point
to https://domainname.com/ */
ENV['ember-simple-auth'] = {
authorizer: 'authorizer:token', //uses ember-simple-auth-token authorizer
crossOriginWhitelist: ['http://localhost:4000'], // for CORS
baseURL: '/',
authenticationRoute: 'login', // Ember.js route that does authentication
routeAfterAuthentication: 'profile', // Ember.js route to transition to after authentication
routeIfAlreadyAuthenticated: 'profile' // Ember.js route to transition to if already authenticated
};
ENV['ember-simple-auth-token'] = {
serverTokenEndpoint: 'http://localhost:4000/auth/token', // Where to get JWT from
identificationField: 'email', // identification field that is sent to Express.js server
passwordField: 'password', // password field sent to Express.js server
tokenPropertyName: 'token', // expected response key from Express.js server
authorizationPrefix: 'Bearer ', // header value prefix
authorizationHeaderName: 'Authorization', // header key
headers: {},
};
ENV['apihost'] = "http://localhost:4000" // Host of the API server passed to `app/adapters/application.js`
ENV['apinamespace'] = ""; // Namespace of API server passed to `app/adapters/application.js`
** Настройка сервера Express.js
**
Необходимые пакеты:
express
: Самоходный пояснительная
body-parser
: для синтаксического анализа JSON от ember.js
сайт
cors
: для CORS поддержки
ejwt
: для нуждающихся JWT по большинству маршрутов в свой API сервера
passport
: для аутентификации пользователей
passport-json
: для аутентификации пользователей
bcrypt
: для хеширования/соления паролей пользователей
sequelize
: для моделирования данных
** Настройка server.js
**
var express = require('express'); // App is built on express framework
var bodyParser = require('body-parser'); // For parsing JSON passed to use through the front end app
var cors = require('cors'); // For CORS support
var ejwt = require('express-jwt');
var passport = require('passport');
// Load Configuration files
var Config = require('./config/environment'),
config = new Config // Load our Environment configuration based on NODE_ENV environmental variable. Default is test.
var corsOptions = {
origin: config.cors
};
var app = express(); // Define our app object using express
app.use(bodyParser.urlencoded({extended: true})); // use x-www-form-urlencoded used for processing submitted forms from the front end app
app.use(bodyParser.json()); // parse json bodies that come in from the front end app
app.use(bodyParser.json({ type: 'application/vnd.api+json' })); // THIS ALLOWS ACCEPTING EMBER DATA BECAUSE JSON API FORMAT
app.use(cors(corsOptions)); // Cross-Origin Resource Sharing support
app.use(passport.initialize()); // initialize passport
app.use(ejwt({ secret: config.secret}).unless({path: ['/auth/token', { url : '/users', methods: ['POST']}]}));
require('./app/routes')(app); // Load our routes file that handles all the API call routing
app.listen(config.port); // Start our server on the configured port. Default is 4000
console.log('listening on port : ' + config.port);
в config/passport.js
// config/passport.js
// Configure Passport for local logins
// Required Modules
var JsonStrategy = require('passport-json').Strategy;
//
var User = require('../app/models/users'); // load user model
// Function
module.exports = function (passport) {
// serialize the user for the session
passport.serializeUser(function (user, done) {
done(null, user.id);
});
// deserialize the user
passport.deserializeUser(function (id, done) {
User.findById(id).then(function (user) {
done(null, user);
});
});
// LOCAL LOGIN ==========================================================
passport.use('json', new JsonStrategy({
usernameProp : 'email',
passwordProp : 'password',
passReqToCallback : true
},
function (req, email, password, done) {
User.findOne({where : {'email' : email }}).then(function (user) { // check against email
if (!user) {
User.findOne({where : {'displayName' : email}}).then(function(user){ //check against displayName
if (!user) return done(null, false);
else if (User.validatePassword(password,user.password)) return done(null, user);
else return done(null, false);
});
}
else if (User.validatePassword(password,user.password)) return done(null, user);
else return done(null, false);
});
}));
};
Пример app/models/users.js
пользователя модели sequelize
// Load required Packages
var Sequelize = require('sequelize');
var bcrypt = require('bcrypt-node')
// Load required helpers
var sequelize = require('../helpers/sequelizeconnect');
var config = new require('../../config/environment'); // Load our Environment configuration based on NODE_ENV environmental variable. Default is test.
// Load other models
// Define model
var Users = sequelize.define('users', {
"email": { type: Sequelize.STRING}, // user email
"password": { type: Sequelize.STRING} // user password
});
// Methods =======================================================
// Hash a password before storing
Users.generateHash = function(password) {
return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
};
// Compare a password from the DB
Users.validatePassword = function(password, dbpassword) {
return bcrypt.compareSync(password, dbpassword);
}
module.exports = Users
На данный момент сервер express.js
просто нужно ваш routes.js
настроить с маршрутами для ваших потребностей серверных API, на минимум /auth/token
, чтобы выполнить аутентификацию. Пример успешного ответа адаптер API Ember.js
JSON ожидает это:
var jsonObject = { // create json response object
"data": {
"type": "users", // ember.js model
"id": 1, // id of the model
"attributes": {
"email" : "[email protected]",
}
}
}
res.status(201).json(jsonObject); // send new data object with 201/OK as a response
Существует гораздо больше сложностей в настройке сервера API JSON, чтобы отвечать на запросы Удалить, ошибку валидации и т.д.
Есть ли у вас работал через [руководства] (https://guides.emberjs.com/v2.9.0/)? Безопасное соединение может быть установлено с помощью «HTTPS». Если вы хотите аутентификации, существует множество опций, включая, но не ограничиваясь только 'ember-simple-auth'. Обычно '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' – Lux
Я читал большинство гидов. Я ценю ваш комментарий (Lux), но я хотел бы получить ответ (гораздо более подробно) ... Спасибо. – Timo
Я сомневаюсь, что вы его получите.Вопрос слишком широк. Если вы хотите знать, что внутренние элементы ember читают код, и если у вас есть проблемы с его использованием, попробуйте быть конкретным, покажите код и опишите проблемы, которые у вас есть. – Lux