2016-11-16 2 views
-1

Я пытаюсь связать Ember-Data с JSON-API при поддержке Express.JS.Ember-данных Работа с JSON-API


Я знаю, что это ...

modelsadaptersserializers

... но как они работают вместе ? И как они вписываются во всю картину Ember.JS?


Как я могу установить безопасное соединение между JSON-API и ember.js?

+0

Есть ли у вас работал через [руководства] (https://guides.emberjs.com/v2.9.0/)? Безопасное соединение может быть установлено с помощью «HTTPS». Если вы хотите аутентификации, существует множество опций, включая, но не ограничиваясь только 'ember-simple-auth'. Обычно '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' – Lux

+0

Я читал большинство гидов. Я ценю ваш комментарий (Lux), но я хотел бы получить ответ (гораздо более подробно) ... Спасибо. – Timo

+0

Я сомневаюсь, что вы его получите.Вопрос слишком широк. Если вы хотите знать, что внутренние элементы ember читают код, и если у вас есть проблемы с его использованием, попробуйте быть конкретным, покажите код и опишите проблемы, которые у вас есть. – Lux

ответ

2

Это очень широкий вопрос, но недавно я прошел через все это, я верю, что могу дать подробный ответ о том, как Я внедрил. Это ключ, потому что есть очень много вариантов, и если вы посмотрите на большинство учебных пособий, они в основном фокусируются вокруг, используя 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
      • Монго
      • Sequelize
      • Другое
  • 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, чтобы отвечать на запросы Удалить, ошибку валидации и т.д.