我正在使用firebase + angularjs应用,我使用简单的电子邮件和密码验证,并且它正常工作。
我只是想知道我是否可以在firebase email + password auth正在使用的用户表上添加额外的用户数据,就像我想在不创建额外节点的情况下添加有关用户的帐单信息和其他详细信息/ firebase上的表来存储这些额外的数据。
答案 0 :(得分:45)
Firebase将电子邮件/密码用户存储在您无法直接访问的单独位置。您无法在此位置展开数据。
由于许多应用程序开发人员希望在其应用程序代码中访问用户数据,因此将所有用户存储在应用程序数据库本身内的/users
节点下是一种常见做法。缺点是你必须自己做。但积极的一面是,如果你愿意,你可以存储任何额外的信息。
有关示例代码,请参阅Firebase guide on storing user data。从那里:
var ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com");
ref.onAuth(function(authData) {
if (authData && isNewUser) {
// save the user's profile into Firebase so we can list users,
// use them in Security and Firebase Rules, and show profiles
ref.child("users").child(authData.uid).set({
provider: authData.provider,
name: getName(authData)
});
}
});
答案 1 :(得分:4)
Firebase有一组固定的用户属性,可以更新但不能添加到。
但是,您可以使用JSON.stringify() and JSON.parse()
然后使用任何一个未使用的属性来存储字符串
在DisplayName或photoURL属性中。 请记住,可添加的数据必须小,并存储为字符串。
这只能使用FIREBASE SDK中的方法,而不是如下图所示的angularfire
var user = firebase.auth().currentUser;
user.updateProfile({
displayName: "Jane Q. User",
photoURL: "https://example.com/jane-q-user/profile.jpg"
}).then(function() {
// Update successful.
}, function(error) {
// An error happened.
});
您可以在此处以字符串形式在photoURL或displaYName变量中存储更多类似json的数据。
答案 2 :(得分:3)
注意:此方法仅在您使用Firebase Admin SDK并且您需要在服务器上设置端点以管理自定义令牌时才有效
Firebase Admin SDK可以选择使用其他声明对象创建自定义令牌,该对象可以包含任意数据。这可能有助于存储一些与用户相关的信息,例如用户是否是高级用户。
可以使用var uid = "some-uid"; //this can be existing user UID
var additionalClaims = {
premiumAccount: true,
some-user-property: 'some-value'
};
admin.auth().createCustomToken(uid, additionalClaims)
.then(function(customToken) {
// Send token back to client
})
.catch(function(error) {
console.log("Error creating custom token:", error);
});
对象访问其他声明数据。
示例
additionalClaims
{{1}}也可以在Firebase安全规则中访问。
了解更多信息,请阅读Firebase Custom Tokens
答案 3 :(得分:3)
Firebase用户拥有一组固定的基本属性 - 存储在项目用户数据库中的唯一ID,主电子邮件地址,名称和照片URL,可由用户更新(iOS,Android,Web) )。您无法直接向Firebase用户对象添加其他属性;相反,您可以将其他属性存储在Firebase实时数据库中。
答案 4 :(得分:2)
我的答案与角度无关,但我搜索了一下静电,以了解如何使用Polymer和Polymerfire进行操作,所以我添加了这个答案,以帮助人们比我更快地完成它。
我必须在Frank van Puffelen提到的数据库中添加一个单独的节点。
进口:
<link rel="import" href="../bower_components/polymerfire/firebase-app.html">
<link rel="import" href="../bower_components/polymerfire/firebase-auth.html">
<link rel="import" href="../bower_components/polymerfire/firebase-document.html">
然后在您的应用中的任何位置放置<firebase-app>
组件:
<firebase-app
name="yourAppName"
api-key= "{{yourApi}}"
auth-domain= "{{yourAuthDomain}}"
database-url= "{{yourDbUrl}}"
>
</firebase-app>
之后,您需要使用<firebase-auth>
和&lt; firebase-document>
:
模板:
<firebase-auth
id="auth"
app-name="yourAppName"
signed-in="{{signedIn}}"
user="{{user}}">
</firebase-auth>
<firebase-document
id="document"
app-name="yourAppName"
path="{{usersPath}}" // e.g "/users"
data="{{userDocument}}">
</firebase-document>
脚本:
this._register = function(){
var formValid = this.querySelector('#register-form').validate();
var auth = this.querySelector('#auth');
if(formValid && this.passWordsIdentic){
//The actual registration
auth.createUserWithEmailAndPassword(this.email, this.password).then(function(user){
console.log('auth user registration succes');
//Example values
this.userDocument.uid = user.uid;
this.userDocument.email = user.email;
this.userDocument.firstName = this.firstName;
this.userDocument.lastName = this.lastName;
this.userDocument.userName = this.userName;
this.$.document.save(this.usersPath).then(() => {
console.log("custom user registration succes");
this.$.document.reset();
});
}.bind(this)).catch(function(error) {
var errorCode = error.code;
var errorMessage = error.message;
console.log('error: ', errorCode);
);
}
}
就是这样,你可能想看看这个优秀的google codelab,这是使用firebase和聚合物的一个很好的介绍。
答案 5 :(得分:0)
这是一个快速版本。您的用户结构(“表格”)就像
--users:
-------abc,d@email,com:
---------------email:abc.d@email.com
---------------name: userName
etc.
通过身份验证FIRAuth.auth()?.createUser
后,您可以在数据库中设置用户,如下所示:
let ref = FIRDatabase.database().reference()
let rootChild = ref.child("users")
let changedEmailChild = u.email?.lowercased().replacingOccurrences(of: ".", with: ",", options: .literal, range: nil) // Email doesn't support "," firebase doesn't support "."
let userChild = rootChild.child(changedEmailChild!)
userChild.child("email").setValue(u.email)
userChild.child("name").setValue(signup.name)
答案 6 :(得分:0)
请注意,方法在v4.0.0中已更改。因此,您需要使用以下代码来检索用户配置文件:
afAuth.authState.subscribe((user: firebase.User) => {
this.displayName = user.displayName;
this.email = user.email;
this.photoURL = user.photoURL;
});
答案 7 :(得分:0)
Frank的答案很好,但Angular6 / Firebase5 / Angularfire5的情况有所不同:
以下是我用于登录用户的点击处理程序:
this.afAuth.auth.signInWithPopup(new firebase.auth.GoogleAuthProvider()).then((e) => {
console.log("Log-In Success" + e.additionalUserInfo.profile.name);
if (e.additionalUserInfo.isNewUser)
this.addUserToDatabase(/*...*/);
}).catch((error) => {
console.log("Log-In Error: Google Sign-In failed");
});
答案 8 :(得分:0)
这是注册代码,在“用户”表中添加其他字段
import { AngularFireAuth } from "@angular/fire/auth";
constructor(private firebaseAuth: AngularFireAuth){}
registration(data: any, password: any) {
return this.firebaseAuth.auth.createUserWithEmailAndPassword(data.Email, password)
.then(res => {
res.user.updateProfile({
displayName: `${data.DisplayName}`
})
data.UserId = res.user.uid;
data.PhoneNumbers = [{
NumberType: '',
NumberValue: ''
}];
data.PhotoUrl = '';
data.Addresses = [{
AddressLine1: '',
AddressLine2: '',
City: '',
State: '',
Country: '',
PostalCode: '',
AddressType: ''
}];
data.IsDeleted = false;
this.fireStore.doc(`users/${res.user.uid}`).set(data);
this.toastr.success('User has been register successfully!', 'Successfull!');
return true;
}).catch(err => {
switch (err.code) {
case 'auth/email-already-in-use':
this.toastr.error(`Email address ${data.Email} already in use.`, 'Error!');
break;
case 'auth/invalid-email':
this.toastr.error(`Email address ${data.Email} is invalid.`, 'Error!');
break;
case 'auth/operation-not-allowed':
this.toastr.error('Error during sign up.', 'Error!');
break;
case 'auth/weak-password':
this.toastr.error('Password is not strong enough. Add additional characters including special characters and numbers.', 'Error!');
break;
default:
this.toastr.error(err.message, 'Error!');
break;
}
});
}