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