Firebase phone 身份验证在 Ionic 4 中有效,但 Firebase 权限被拒绝
Firebase phone authentication works in Ionic 4, but Firebase permission denied
使用这个插件@ionic-native/firebase-authentication/ngx,我能够进行 phone 身份验证,但是在身份验证之后,我尝试从 Firestore 检索数据(使用 angularfirestore),我得到了 FirebaseError: Missing or insufficient permissions.
错误。
(一点背景故事。我正在将 Ionic v3 (Firebase) 应用程序迁移到 Ionic v4 (Firestore)。此用户的 phone 身份验证适用于 v3,但不适用于 v4)。
这是部分代码
import { FirebaseAuthentication } from '@ionic-native/firebase-authentication/ngx'; import { Query, AngularFirestore } from '@angular/fire/firestore';
//...
constructor(private afs: AngularFirestore,
private firebaseAuthentication: FirebaseAuthentication )
//...
this.firebaseAuthentication.onAuthStateChanged().subscribe((user)=>{
console.log(user);// This correctly shows the user object
//...
const snapshot = await this.afs.collection(collection).doc(user.uid).ref.get(); // <-- Permissions error
// ...
});
这是 Firestore 规则...
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth.uid != null;
}
}
}
...和 Firebase 规则
{
"rules": {
".read": "auth != null",
".write": "auth != null",
"quotes": {
".indexOn": ["businessprofile_id","request_id"]
},
"quotes-by-business-profile": {
".indexOn": ["request_id"]
},
"businessprofiles": {
"$userid":{
".indexOn": ["status"]
,".read": "auth.uid == $userid || auth.userId == $userid",
".write": "auth.uid == $userid || auth.userId == $userid"
}
},
"requests": {
"$requestid":{
".indexOn": ["userid", "category", "status"]
},
".indexOn": ["userid", "status", "accepted_businessprofile_id"]
},
"users" : {
"$users" : {
".read": "auth.uid == $users || auth.userId == $users",
".write": "auth.uid == $users || auth.userId == $users"
}
},
"messages" : {
".indexOn" : ["request_id", "businessprofile_userid", "userid","businessprofile_id"]
},
"businesslocations" : {
".indexOn": "g"
},
"countries" :
{
".read": true
}
}
}
有人用 Ionic 4 成功实现了 firebase phone 身份验证吗??我在 Whosebug 中尝试过其他解决方案,但没有成功。
谢谢。
根据问题的评论将此作为社区 wiki 发布。
看来解决问题的方法是改变登录方式。正如@ObiE 指出的那样,他使用了以下方法:
signInCredential = firebase.auth.PhoneAuthProvider.credential(env.verificationId, data.confirmationCode);
firebase.auth().signInWithCredential(signInCredential).then((success) => {
...
而不是之前使用的:
this.firebaseAuthentication.signInWithVerificationId(env.verificationId,data.confirmationCode).then((user)=>{console.log(user)
登录中的此更改适用于未通过 phone 进行身份验证的用户。
使用这个插件@ionic-native/firebase-authentication/ngx,我能够进行 phone 身份验证,但是在身份验证之后,我尝试从 Firestore 检索数据(使用 angularfirestore),我得到了 FirebaseError: Missing or insufficient permissions.
错误。
(一点背景故事。我正在将 Ionic v3 (Firebase) 应用程序迁移到 Ionic v4 (Firestore)。此用户的 phone 身份验证适用于 v3,但不适用于 v4)。
这是部分代码
import { FirebaseAuthentication } from '@ionic-native/firebase-authentication/ngx'; import { Query, AngularFirestore } from '@angular/fire/firestore';
//...
constructor(private afs: AngularFirestore,
private firebaseAuthentication: FirebaseAuthentication )
//...
this.firebaseAuthentication.onAuthStateChanged().subscribe((user)=>{
console.log(user);// This correctly shows the user object
//...
const snapshot = await this.afs.collection(collection).doc(user.uid).ref.get(); // <-- Permissions error
// ...
});
这是 Firestore 规则...
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth.uid != null;
}
}
}
...和 Firebase 规则
{
"rules": {
".read": "auth != null",
".write": "auth != null",
"quotes": {
".indexOn": ["businessprofile_id","request_id"]
},
"quotes-by-business-profile": {
".indexOn": ["request_id"]
},
"businessprofiles": {
"$userid":{
".indexOn": ["status"]
,".read": "auth.uid == $userid || auth.userId == $userid",
".write": "auth.uid == $userid || auth.userId == $userid"
}
},
"requests": {
"$requestid":{
".indexOn": ["userid", "category", "status"]
},
".indexOn": ["userid", "status", "accepted_businessprofile_id"]
},
"users" : {
"$users" : {
".read": "auth.uid == $users || auth.userId == $users",
".write": "auth.uid == $users || auth.userId == $users"
}
},
"messages" : {
".indexOn" : ["request_id", "businessprofile_userid", "userid","businessprofile_id"]
},
"businesslocations" : {
".indexOn": "g"
},
"countries" :
{
".read": true
}
}
}
有人用 Ionic 4 成功实现了 firebase phone 身份验证吗??我在 Whosebug 中尝试过其他解决方案,但没有成功。
谢谢。
根据问题的评论将此作为社区 wiki 发布。
看来解决问题的方法是改变登录方式。正如@ObiE 指出的那样,他使用了以下方法:
signInCredential = firebase.auth.PhoneAuthProvider.credential(env.verificationId, data.confirmationCode);
firebase.auth().signInWithCredential(signInCredential).then((success) => {
...
而不是之前使用的:
this.firebaseAuthentication.signInWithVerificationId(env.verificationId,data.confirmationCode).then((user)=>{console.log(user)
登录中的此更改适用于未通过 phone 进行身份验证的用户。