Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js EmberFire身份验证和座椅适配器_Ember.js_Firebase_Firebase Authentication_Torii - Fatal编程技术网

Ember.js EmberFire身份验证和座椅适配器

Ember.js EmberFire身份验证和座椅适配器,ember.js,firebase,firebase-authentication,torii,Ember.js,Firebase,Firebase Authentication,Torii,我已经跟随EmberFire建立了与Tori提供商的身份验证,它工作得非常完美。我希望在用户经过身份验证后将用户数据存储在firebase中,并在整个应用程序中访问用户对象 我以前曾经在一段时间以前用ember做过这个,但是我不确定如何使用新的Tori提供商来做 我想我应该测试用户是否已经存储在firebase中的初始化器函数中,然后将用户注入控制器/路由 任何为我指明正确方向的帮助都会很有帮助,或者提供一些示例代码 谢谢您需要一个Tori适配器,它可以实现打开和获取,并执行查找/保存到特定于应

我已经跟随EmberFire建立了与Tori提供商的身份验证,它工作得非常完美。我希望在用户经过身份验证后将用户数据存储在firebase中,并在整个应用程序中访问用户对象

我以前曾经在一段时间以前用ember做过这个,但是我不确定如何使用新的Tori提供商来做

我想我应该测试用户是否已经存储在firebase中的初始化器函数中,然后将用户注入控制器/路由

任何为我指明正确方向的帮助都会很有帮助,或者提供一些示例代码


谢谢

您需要一个Tori适配器,它可以实现
打开
获取
,并执行
查找
/
保存
到特定于应用程序的用户模型。我们的SeaAdapter还不能做到这一点。我已经为你做了一个有用的:

// app/torii-adapters/application.js

import Ember from 'ember';

export default Ember.Object.extend({
  firebase: Ember.inject.service(),
  store: Ember.inject.service(),

  /**
   * Executed after Firebase authentication.
   *
   * Find or create the user based on the Firebase `authData`
   *
   * @param  {Object} authData
   * @return {Promise<Object>} Updated session info
   */
  open(authData) {
    return this._findOrCreateUser(authData)
      .then((user) => {
        return { currentUser: user };
      });
  },

  /**
   * Fetch an existing Firebase auth session and place into `session.currentUser`
   *
   * @return {Promise<Object>} Updated session info
   */
  fetch() {
    let ref = this.get('firebase');
    let authData = ref.getAuth();

    if (!authData) {
      return Ember.RSVP.Promise.reject(new Error('No Firebase session found'));
    }

    return this._findOrCreateUser(authData)
      .then((user) => {
        return { currentUser: user };
      });
  },

  /**
   * Teardown a session. Remove the `session.currentUser`.
   *
   * @return {Promise<Object>} Updated session info
   */
  close() {
    this.get('firebase').unauth();
    return Ember.RSVP.Promise.resolve({ currentUser: null });
  },

  /**
   * Find the user with the given `authData`, create if not found
   *
   * @param  {Object} authData
   * @return {Promise<Object>} The user
   */
  _findOrCreateUser(authData) {
    let store = this.get('store');

    return store.find('user', authData.uid)
      .catch(() => {
        let newUser = store.createRecord('user', this.extractUserProperties(authData));

        return newUser.save();
      });
  },

  /**
   * Extract the user properties from `authData` that you care about.
   *
   * @param  {Object} authData
   * @return {Object} An updated property hash
   */
  extractUserProperties(authData) {
    var name = 'Unknown';
    var provider = authData.provider;
    var userData = authData[provider];

    if (userData.displayName) {
      name = userData.displayName;
    } else if (userData.username) {
      name = userData.username;
    }

    return {
      id: authData.uid,
      name: name,
      email: userData.email || null
    };
  }
});
//app/torii adapters/application.js
从“余烬”导入余烬;
导出默认的Ember.Object.extend({
firebase:Ember.inject.service(),
存储区:Ember.inject.service(),
/**
*在Firebase身份验证后执行。
*
*基于Firebase`authData查找或创建用户`
*
*@param{Object}authData
*@return{Promise}已更新会话信息
*/
打开(authData){
返回此。\u findOrCreateUser(authData)
。然后((用户)=>{
返回{currentUser:user};
});
},
/**
*获取现有Firebase身份验证会话并放入`session.currentUser`
*
*@return{Promise}已更新会话信息
*/
fetch(){
设ref=this.get('firebase');
让authData=ref.getAuth();
如果(!authData){
返回Ember.RSVP.Promise.reject(新错误(“未找到Firebase会话”);
}
返回此。\u findOrCreateUser(authData)
。然后((用户)=>{
返回{currentUser:user};
});
},
/**
*拆卸会话。删除“session.currentUser”。
*
*@return{Promise}已更新会话信息
*/
关闭(){
this.get('firebase').unauth();
返回Ember.RSVP.Promise.resolve({currentUser:null});
},
/**
*找到具有给定“authData”的用户,如果找不到,则创建
*
*@param{Object}authData
*@return{Promise}用户
*/
_findOrCreateUser(authData){
让store=this.get('store');
返回store.find('user',authData.uid)
.catch(()=>{
让newUser=store.createRecord('user',this.extractUserProperties(authData));
返回newUser.save();
});
},
/**
*从您关心的“authData”中提取用户属性。
*
*@param{Object}authData
*@return{Object}更新的属性哈希
*/
extractUserProperties(authData){
变量名称='未知';
var provider=authData.provider;
var userData=authData[provider];
if(userData.displayName){
name=userData.displayName;
}else if(userData.username){
name=userData.username;
}
返回{
id:authData.uid,
姓名:姓名,,
电子邮件:userData.email | | null
};
}
});
您所需要做的就是更新
extractUserProperties
方法,将您关心的属性放在用户模型的正确位置-每个人都以不同的方式实现其用户模型

现在,您应该能够查找session.currentUser,它将返回一个对应于登录用户的余烬数据模型


希望有帮助。我们正在将其添加到网站文档中,并将尝试找到一种方法将其应用到EmberFire提供的TorifiRebaSeaAdapter中。

我建议始终查看:

在那里,您可以发现您必须覆盖的唯一方法是
open

我的解决方案并不完美,不过你也可以看看这个(它与GoogleOAuth配合得很好)

从“余烬”导入余烬;
从“emberfire/torii适配器/firebase”导入torii适配器;
导出默认的TorifiRebaseAdapter.extend({
firebase:Ember.inject.service(),
存储区:Ember.inject.service(),
打开(身份验证){
返回此。\u findOrCreateUser(authentication.uid,authentication[authentication.provider])
.然后(用户=>Ember.RSVP.resolve({
提供者:authentication.provider,
uid:authentication.uid,
当前用户:用户
}));
},
_findOrCreateUser(uid,userData){
让store=this.get('store');
返回store.findRecord('user',uid)。然后(
功能(用户){
user.set('name',userData.displayName);
user.set('imageUrl',userData.profileImageURL);
user.save();
返回用户;
},
函数(){
let user=store.createRecord('user'{
id:uid,
名称:userData.displayName,
imageUrl:userData.profileImageURL
});
user.save();
返回用户;
}
);
},
});

谢谢你,这正是我想要的。它起作用了treat@tstirrat您能详细说明我如何在路由中访问“beforeModel”钩子中的“session.currentUser”吗?当前,当我执行“console.log(this.get('session.currentUser');”时,我得到了“undefined”,但当我在任何模板中执行{session.currentUser}}时,我可以看到那里的用户。@VikramNarayan不幸的是,我不确定为什么会出现这种情况。这与Tori将会话注入路由的方式有关。它似乎注入了一个部分初始化的对象,然后对其进行更新。@VikramNarayan实际上,这是我做的。我必须使我的应用程序路由的
在模型之前
钩子返回
会话。fetch()
承诺,以便它阻塞并等待会话完全获取。我将在我们的文档中更新此内容。此内容是否已添加到EF回购中??