Firebase reauthenticateAndRetrieveDataWithCredential问题

时间:2018-08-07 08:45:11

标签: javascript firebase firebase-authentication

方法reauthenticateAndRetrieveDataWithCredential需要credential

我尝试过,这给了我一个错误:

const user = firebase.auth().currentUser;
const credential = firebase.auth.OAuthCredential;
await user.reauthenticateAndRetrieveDataWithCredential(credential);
await user.updateEmail(email);
return email;

错误消息

  

reauthenticateAndRetrieveDataWithCredential失败:第一个参数“ credential”必须是有效的凭据。

我只有宣誓身份验证(没有电子邮件和密码)。因此,我无法弄清credential Firebase的需求。有帮助吗?

编辑: 由于某种原因,我的firebase.auth.OAuthCredential或(firebase.auth.AuthCredential)返回未定义。用户已登录/授权。

3 个答案:

答案 0 :(得分:4)

documentation for reauthenticating the user显示了此示例:

var user = firebase.auth().currentUser;
var credential;

// Prompt the user to re-provide their sign-in credentials

user.reauthenticateAndRetrieveDataWithCredential(credential).then(function() {
  // User re-authenticated.
}).catch(function(error) {
  // An error happened.
});

您的代码无法正确实现注释。您将需要提示用户再次提供其凭证,将其放入正确的凭证对象类型中,然后将其传递。

例如:

var credential = firebase.auth.EmailAuthProvider.credential(
    email,
    password
);

答案 1 :(得分:2)

在Vue.js项目中遇到此问题,我们在其中有一个firebase.js文件,该文件处理const的模块导入和导出。

希望这可以帮助某人在使用类似设置时节省时间。

文件:firebase.js

import firebase from 'firebase/app'
import 'firebase/auth'
import 'firebase/database'


// Initialize Firebase
const app = firebase.initializeApp(options)
export const fb = firebase
export const auth = app.auth()
export const db = app.database()
export const functions = app.functions()

其他脚本文件中或changePassword()内部的*.vue的示例

import { fb, auth } from './firebase.js'
...
changePassword() {
  if (yourFormValidation == true) {
    let user = auth.currentUser

    const credentials = fb.auth.EmailAuthProvider.credential(
      user.email,
      this.current_password
    )
    user.reauthenticateAndRetrieveDataWithCredential(credentials)
      .then(() => {
        user.updatePassword(this.new_password)
          .then(() => {
            console.log('your password was successfully changed.')
          })
          .catch(error => console.log(error))
      })
      .catch(error => console.log(error.message))
  }
}

我遇到Cannot read property 'credential' of undefined"的地方...

仅导入{ auth } from './firebase.js,然后调用auth.EmailAuthProvider()

如何访问firebase.auth()上的其他课程...

    export const fb = firebase中的
  1. firebase.js

  2. import { fb, auth } from './firebase.js'在哪里编写函数

  3. 调用fb.auth.EmailAuthProvider.credential()或其他所需的类

答案 2 :(得分:0)

您需要使用订阅来监视更改。使用AngularFire来监视它们何时登录并获取UID(假设您在Firebase中使用身份验证登录名,以便所有数据都使用UID作为树路径保存。

您还可以添加设置的超时时间,以在给定时间后退订

   import { AngularFirestore } from 'angularfire2/firestore';
    import { AngularFireDatabase, AngularFireList } from 'angularfire2/database';
    import { AngularFireAuth } from 'angularfire2/auth';
    import { switchMap, map } from 'rxjs/operators';
    import { Observable,  pipe } from 'rxjs';
    import { Observable, Subscription } from 'rxjs';
    import firebase as firebase from 'firebase/app';

private myOAuthSubscription: Subscription;
private myDatasubscription: Subscription;    
public userloggedin:boolean = false;
public uid:string = '';
private functionhasrun:boolean = false;

    public this.items:any = [];

    constructor(
      public _DB: AngularFireDatabase,
      public _afAuth: AngularFireAuth,
    ) {

    //check that the user is logged in 
    try {
      this.myOAuthSubscription = this._afAuth.authState.subscribe(user => {

        if (user && user.uid) {

          console.log('loggedin = true');
          this.userloggedin = true;
          this.uid = String(user.uid);

          if(this.functionhasrun==false){

           this.functionhasrun = true;
           this.funDoDB():

          }

        } else {

        console.log('loggedin = false');
        this.userloggedin = true;
        this.uid = '';

        }
      });
    } catch (e) {
      console.error("fbData_subscription", e);
    }



    }

    ngOnDestroy() {
      this.myOAuthSubscription.unsubscribe();
      this.myDatasubscription.unsubscribe();
    }


    private funDoDB(){
          if(this.userloggedin == true){
          try {

        //subscription using AngulaFire
        this.myDatasubscription = this._DB.list('myDataPath/' + this.uid).snapshotChanges().pipe(map(actions => {
            return actions.map(action => ({ key: action.key, val: action.payload.val() }));
          }))
          .subscribe(items => {

            this.items = [];
            this.items = items.map(item => item);

            console.log("db results",this.items);

            var icount=0;

            for (let i in this.items) {

             console.log("key",this.items[i].key);
             console.log("val",this.items[i].val); 
             console.log("----------------------------------);

             //checking if something exists
             if (this.items[i].key == 'SomeNodePath') {
               var log = this.items[i].val;
             }

            }


          } catch (e) {
            console.error(e);
          }


          });
        }
        }

    npm install --save angularfire2 firebase
    npm install -D rxjs@6.2.2 rxjs-compat@6.2.2