Firebase 3.0 + Ember 2.0: адаптер Torii должен реализовывать `open` для открытия сессии
У меня проблема с аутентификацией в Facebook с помощью адаптера torii, ошибка: "Адаптер Torii должен быть реализован open
для открытия сессии ".
Я посетил много учебных пособий и перепробовал все представленные методы, но большинство из них, как правило, являются старым ember-кодом, и, похоже, ни один из них на самом деле не работает.
Текущее состояние: я могу войти, я получаю всплывающее окно на Facebook и могу авторизоваться.
Используя fiddler, я также вижу ответ от API, содержащий ответ JSON со всеми учетными данными пользователя, с которым я проходил аутентификацию. В консоли Firebase я могу видеть авторизованного пользователя, сбросить его пароль, запретить доступ,...
Все это заставляет меня поверить, что это "просто" проблема переднего плана, в которой я не могу установить правильную "сессию" для работы.
Моей конечной целью было бы подобрать соответствующие пользовательские данные и перенести их в мой бэкэнд Firebase в качестве записи "пользователя", что позволяет быстро регистрироваться для посетителей сайта, но я буду более чем рад провести активный сеанс, чтобы я мог отработать все остальное самостоятельно.
Будучи передовым новичком (я обычно пишу на C#), Эмбер, возможно, не был лучшим выбором, чтобы повесить его, но я так далеко, я не собираюсь позволять всему этому скользить и поднимать другой фреймворк.
Мой код:
конфиг / environment.js
firebase: {
apiKey: 'xxxxxxx',
authDomain: 'myappname.firebaseapp.com',
databaseURL: 'https://myappname.firebaseio.com',
storageBucket: 'myappname.appspot.com',
messagingSenderId: '1234567890'
},
torii: {
sessionServiceName: 'session'
}
torii-adapters / application.js (я так сильно это изменил, я даже не могу вспомнить, какой был исходный код, потому что, похоже, ничего из того, что я изменяю / добавляю / удаляю здесь, вообще ничего не делает).
import Ember from 'ember';
import ToriiFirebaseAdapter from 'emberfire/torii-adapters/firebase';
export default ToriiFirebaseAdapter.extend({
firebase: Ember.inject.service(),
});
маршруты / application.js
import Ember from 'ember';
export default Ember.Route.extend({
beforeModel: function() {
return this.get('session').fetch().catch(function() {
});
},
actions:{
login: function(provider) {
this.get('session').open('firebase', {
provider: provider,
}).then(function(data) {
console.log(data.currentUser);
});
},
logout: function() {
this.get('session').close().then(function() {
this.transitionTo('application');
}.bind(this));
}
}
});
application.hbs
<div class="container">
{{partial 'navbar'}}
<a {{action "signIn" "facebook"}} class="btn">{{fa-icon "facebook"}}</a>
<a {{action "signIn" "twitter"}} class="btn">{{fa-icon "twitter"}}</a>
<a {{action "signIn" "github"}} class="btn">{{fa-icon "github"}}</a>
<a {{action "signIn" "google"}} class="btn">{{fa-icon "google"}}</a>
{{outlet}}
</div>
РЕДАКТИРОВАТЬ 1
Выше код дает мне больше ошибок после перезапуска сервера Ember. Это причина моих неприятностей? Все изменения, которые, казалось бы, ничего не изменили, не были зарегистрированы до перезапуска сервера? Если это так, возможно, я уже сто раз принял правильное решение...
РЕДАКТИРОВАТЬ 2
Изменен код для отражения актуальной проблемы. Предыдущий код был запутан до предела, но я так и не понял, потому что он не работал до перезапуска сервера.
РЕДАКТИРОВАТЬ 3 Нашел и попробовал это, но безрезультатно: /questions/42640404/autentifikatsiya-emberfire-i-toriifirebaseadapter/42640410#42640410
2 ответа
Это ответ Lorem Ipsum Dolor, но обновленный для Ember 3.16+.
// Inside routes/application.js
import Route from '@ember/routing/route';
import { inject as service } from '@ember/service';
export default class ApplicationRoute Route {
@service session;
async beforeModel() {
try {
return this.session.fetch();
} catch {}
}
}
Обратите внимание, что в Ember 3.16+ не рекомендуется добавлять действия в ваш маршрут. Вместо этого вы можете добавить их в контекст контроллера или компонента:
import Component from '@glimmer/component';
import { inject as service } from '@ember/service';
import { action } from '@ember/object';
export default class LoginLogout extends Component {
@service session;
@service router;
@action
async login(provider) {
let data = await this.session.open('firebase', { provider });
console.log(data.currentUser);
}
@action
async logout() {
await this.session.close();
this.router.transitionTo('application');
}
}
Обратите внимание на добавление службы маршрутизатора. Сервис Router - это способ взаимодействия с маршрутизацией в любом месте наших приложений.
import ToriiFirebaseAdapter from 'emberfire/torii-adapters/firebase';
export default class MyAdapter extends ToriiFirebaseAdapter {
}
У меня была такая же проблема, и я заметил, что мой torii-adapters/application.js
расположен под pods
структура (потому что я использую это). Поэтому я переместил torii-adapters
папка для app
папка и все стало работать.
Попробуйте внедрить службу в маршрут вашего приложения и переместите beforeModel
за пределами actions
хэш,
// Inside routes/application.js
export default Ember.Route.extend({
session: Ember.inject.service(), // (1)
beforeModel: function() {
return this.get('session').fetch().catch(function() {});
},
actions:{
login: function(provider) {
this.get('session').open('firebase', {
provider: provider,
}).then(function(data) {
console.log(data.currentUser);
});
},
logout: function() {
this.get('session').close().then(function() {
this.transitionTo('application');
}.bind(this));
}
}
});
Вчера я выполнил то же самое (Firebase Torii Auth), стараюсь внимательно следовать руководству. Единственное, чего не хватает в руководстве, это ввести session
обслуживание вручную.
До сих пор помню session
ты объявил внутри environment.js
файл? Вы должны ввести его, чтобы сделать его доступным
session: Ember.inject.service(), // (1)
https://github.com/firebase/emberfire/blob/master/docs/guide/authentication.md
Внутри моего ToriiFirebaesAdapter,
import ToriiFirebaseAdapter from 'emberfire/torii-adapters/firebase';
export default ToriiFirebaseAdapter.extend({
});