Firebase 3.0 + Ember 2.0: адаптер Torii должен реализовать «open», чтобы сеанс был открыт.

У меня проблема с аутентификацией facebook с помощью адаптера torii, ошибка: «Адаптер Torii должен реализовывать open для открытия сеанса».

Я посетил много руководств и попробовал все представленные методы, но большинство из них, как правило, представляют собой старый код Ember, и ни один из них, похоже, не работает.

Текущее состояние: я могу войти в систему, у меня появляется всплывающее окно facebook, и я могу авторизоваться.

Используя fiddler, я также могу увидеть ответ от API, содержащий ответ JSON со всеми учетными данными от пользователя, с которым я прошел аутентификацию. В консоли firebase я вижу авторизованного пользователя, сбрасываю его пароль, запрещаю доступ,...

Все это наводит меня на мысль, что это «всего лишь» интерфейсная проблема, когда я не могу установить правильный «сеанс» для работы.

Моя конечная цель состояла бы в том, чтобы собрать соответствующие пользовательские данные и передать их в мою серверную часть firebase в качестве записи «пользователь», что позволяет быстро регистрироваться для посетителей сайта, но я буду более чем рад иметь активный сеанс, чтобы я мог остальное доделываю сам.

Как новичок во фронтенде (обычно я программирую на C#), Ember, возможно, был не лучшим выбором, чтобы освоить его, но сейчас я так далеко, я не собираюсь пускать все это на самотёк и выбирать другой. рамки.

Мой код:

конфиг/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));
    }
  }
});

приложение.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

Изменен код, чтобы отразить актуальную проблему. Предыдущий код был безмерно испорчен, но я никогда не осознавал этого, потому что он не подхватывался до перезагрузки сервера.

EDIT 3 Нашел и попробовал это, но безрезультатно: https://stackoverflow.com/a/32079863/4309050


person Silvio Langereis    schedule 31.03.2017    source источник


Ответы (3)


Это ответ 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 {

}
person NullVoxPopuli    schedule 21.06.2020
comment
Редко можно найти обновленный код Ember, что усложняет задачу, если вы переходите на более поздние версии Ember, так что спасибо. Очень признателен. - person Craicerjack; 27.02.2021

У меня была такая же проблема, и я заметил, что мой torii-adapters/application.js находится под структурой pods (потому что я ее использую). Итак, я переместил папку torii-adapters в папку app, и все заработало.

person Dan Steshenko    schedule 24.09.2017
comment
В моем проекте не так, нет структуры pod, а классическая компоновка. Я еще не возвращался к этой проблеме, я переключился на Auth0, который работал как шарм из коробки. :) - person Silvio Langereis; 26.09.2017

ПРИМЕЧАНИЕ. Для приложений Ember 3.16+ приведен тот же код, но с обновленным синтаксисом/шаблонами: https://stackoverflow.com/a/62500685/356849

Приведенное ниже относится к Ember ‹ 3.16, хотя код будет работать как 3.16+ с полной обратной совместимостью, но писать старый код не всегда интересно.


Попробуйте внедрить службу в маршрут вашего приложения и переместить 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({
});
person Glass    schedule 01.04.2017
comment
Такой подход имеет смысл. Я дам ему водоворот и дам вам знать! - person Silvio Langereis; 01.04.2017
comment
Честно говоря, простая аутентификация Ember — лучший выбор для аутентификации приложения Ember. Но вам нужно реализовать свой собственный адаптер. - person Glass; 01.04.2017
comment
Я получаю ту же ошибку даже после внедрения сеанса в application.js. Я на другой машине и запустил код аутентификации с нуля с более ранней фиксацией, думаю, мне придется написать свой собственный адаптер с простой аутентификацией. Очень жаль, что документации по Ember очень мало, тем не менее мне это нравится. - person Silvio Langereis; 01.04.2017
comment
В чем ошибка? Можете ли вы попробовать log ваш объект сеанса внутри beforeModel хука? Каковы ваши внешние зависимости? - person Glass; 01.04.2017
comment
«Адаптер Torii должен реализовать open для открытия сеанса». Тот же код, что и выше, beforeModel ушел из действий и добавил инъекцию - person Silvio Langereis; 01.04.2017
comment
Какая у вас версия тории? - person Glass; 01.04.2017
comment
Emberfire: 2.0.6, тории: 0.8.2 - person Silvio Langereis; 01.04.2017
comment
Вы когда-нибудь устанавливали ember-simple-auth раньше? - person Glass; 01.04.2017
comment
У меня есть, но не на этой машине и не внутри коммита, с которого я начал. - person Silvio Langereis; 01.04.2017
comment
Дайте мне несколько минут, позвольте мне создать новую демонстрацию, чтобы увидеть, работает ли она. - person Glass; 01.04.2017
comment
Посмотрите эту демонстрацию github.com/li-xinyang/FE_FirebaseAuthDemo Я использую GitHub в качестве провайдера и он работает так, как ожидалось - person Glass; 01.04.2017
comment
Код идентичен, за исключением вставки ember, которую я удалил из torii-adapter/application.js, но она все еще не работает. Собираюсь установить новое приложение, как вы, и проверить, работает ли оно. Мне кажется, или это довольно странно? - person Silvio Langereis; 01.04.2017
comment
Уточните, почему он у вас не просыпается :`( - person Glass; 01.04.2017
comment
Та же ошибка, на этот раз с нуля. Единственное отличие: при использовании github я получаю «неопределенную» ошибку, вероятно, связанную с «console.log(data.currentUser)», который не найден. Аутентификация Facebook и Twitter выдает ошибку «Адаптер Torii должен реализовать открытие для открытия сеанса». - person Silvio Langereis; 01.04.2017