使用Ionic3 Angular+FB原生Cordova插件登录,Firebase安全规则auth变量是否自动获取UID?
咱们先明确核心点:你用Cordova原生Facebook插件完成的登录,并不会自动同步到Firebase的认证系统里,所以如果只做了插件登录那一步,Firebase数据库安全规则里的auth变量会是null,没法拿到UID等信息,必须做额外的关联操作。
为什么现有代码没处理Firebase的auth变量?
Cordova的Facebook插件只是帮你完成了和Facebook服务器的身份验证,拿到的是Facebook的access token,但Firebase完全不知道这个登录状态——两者是独立的系统,所以Firebase的auth上下文不会自动填充用户信息。
需要做的额外操作步骤
你需要把Facebook返回的凭证转换成Firebase可识别的认证凭证,让Firebase建立对应的用户会话,这样auth变量才会包含UID等信息:
获取Facebook的访问令牌
用Cordova插件完成登录后,拿到accessToken(比如从response.authResponse.accessToken里提取)。转换为Firebase凭证并登录
调用Firebase的signInWithCredential方法,把Facebook的令牌转成Firebase的用户凭证,完成Firebase侧的登录。
代码示例(Ionic3+AngularFire)
import { Facebook } from '@ionic-native/facebook'; import { AngularFireAuth } from 'angularfire2/auth'; import * as firebase from 'firebase'; constructor( private fb: Facebook, private afAuth: AngularFireAuth ) {} async facebookLogin() { try { // 第一步:用Cordova插件登录Facebook,获取权限 const fbResponse = await this.fb.login(['public_profile', 'email']); // 第二步:生成Firebase的Facebook认证凭证 const fbCredential = firebase.auth.FacebookAuthProvider.credential( fbResponse.authResponse.accessToken ); // 第三步:用凭证登录Firebase const firebaseUser = await this.afAuth.signInWithCredential(fbCredential); // 现在可以拿到Firebase的用户UID了 console.log('当前Firebase用户UID:', firebaseUser.user.uid); } catch (err) { console.error('登录失败:', err); } }
验证安全规则是否生效
完成上述步骤后,Firebase数据库的安全规则里的auth变量就会包含当前用户的信息,比如你可以写这样的规则:
{ "rules": { "userData": { "$uid": { ".read": "auth.uid === $uid", ".write": "auth.uid === $uid" } } } }
此时只有登录用户能读写自己UID对应的节点,规则会正常生效。
如果跳过了Firebase的凭证登录步骤,Firebase会认为用户未认证,auth变量为空,你的安全规则会拒绝所有未授权的访问请求。
内容的提问来源于stack exchange,提问作者Vik

