【问题标题】:Angular2 & Firebase - How to store email and password to use 'reauathenticateWithCredential'Angular2 和 Firebase - 如何存储电子邮件和密码以使用“reauathenticateWithCredential”
【发布时间】:2018-01-09 11:48:50
【问题描述】:

我正在努力实现的目标

  • 一个简单的更新电子邮件和密码“表格”。

问题

  • 当我最近登录时,更改电子邮件工作正常
  • 当我最近没有进行身份验证时,会抛出错误

问题

  • 如何使用“reauathenticateWithCredential”方法?
  • 我应该在哪里存储用户密码以传递给方法?

更改电子邮件表单

saveNewEmailAddress(email: string) {
  this.authService.updateEmailAddress(email);
}

身份验证服务

电子邮件似乎出现在 intelliSense 中(所以我希望它有效 :))。但是,如何传递密码?

updateEmailAddress(email: string) {
    const currentUser = firebase.auth().currentUser;
    const credentials = firebase.auth.EmailAuthProvider.credential(currentUser.email, password);
    currentUser.reauthenticateWithCredential(credentials).then(function () {
      currentUser.updateEmail(email).then(function () {
        // Success
      }).catch(function (error) {
        // An error happened.
      });
    })
  }

这里的任何帮助、代码示例、建议将不胜感激。对此非常陌生。




更新

这就是我让它工作的方式。请告知这是否好。我改变的是:

  • 尝试更改电子邮件时,我会列出当前电子邮件、新电子邮件输入字段和密码字段
  • 密码字段用于当前密码
  • 输入新的电子邮件地址和密码后,“保存”按钮就会启用
  • 我获取新的电子邮件和密码并将它们传递给身份验证服务,在该服务中我运行更新电子邮件的方法

帐户组件 HTML

      <!-- Password -->
      <div class="form-group" [ngClass]="{'has-error': (customerForm.get('password').touched || customerForm.get('password').dirty) && !customerForm.get('password').valid }">
        <label class="col-md-2 control-label" for="passwordId">Password</label>
        <input #currentPassword class="form-control" id="passwordId" type="text" placeholder="Password(required)" formControlName="password"/>
          <span class="help-block" *ngIf="(customerForm.get('password').touched || customerForm.get('password').dirty) && customerForm.get('password').errors">
            <span *ngIf="customerForm.get('password').errors.required">
                Please enter your Password.
            </span>
          <span *ngIf="customerForm.get('password').errors.minlength"> The password must be longer than 10 characters. </span>
        </span>
      </div>

  <!-- Save Button -->
  <div class="form-group">
    <button class="btn btn-primary" type="submit" [disabled]="!customerForm.valid" (click)="saveNewEmailAddress(newEmail.value, currentPassword.value);"> Save </button>
  </div>

帐户组件 TS

  saveNewEmailAddress(email: string, password: string) {
    this.authService.updateEmailAddress(email, password);
  }

身份验证服务

updateEmailAddress(email: string, password: string) {
    const currentUser = firebase.auth().currentUser;
    const credentials = firebase.auth.EmailAuthProvider.credential(currentUser.email, password);
    currentUser.reauthenticateWithCredential(credentials).then(function () {
      currentUser.updateEmail(email).then(function () {
        console.log('i think it worked!');
        currentUser.sendEmailVerification().then(function () {
          console.log('email sent');
        }).catch(function (error) {
          // An error happened.
        });
      }).catch(function (error) {
        console.log(error);
      });
    })
  }

【问题讨论】:

    标签: angular firebase firebase-authentication


    【解决方案1】:

    我设法通过在电子邮件更改弹出窗口中包含密码确认来解决这个问题。这样我就可以将密码值携带到服务中,从而重新验证:)

    【讨论】:

    • 永远不要在客户端存储密码或在 URL 中传递密码。这非常糟糕,会破坏所有安全最佳实践,并使您的用户面临风险。当需要重新认证时,您应该要求用户再次提供密码。如果您不喜欢这样,请使用其他形式的身份验证,例如 OAuth。
    • 谢谢@bojeil。我已经对上面的代码进行了更新,概述了我正在采用的方法。正如我在原始帖子中提到的那样,我对此非常陌生,因此,如果您能够说出我的方法是否有效或提供有关如何安全执行此操作的代码,将不胜感激。文档说明要重新验证您需要传递用户电子邮件和密码。这是我发现在该方法中包含密码的唯一方法。
    • Stackoverflow 问题:stackoverflow.com/questions/39909964/… - 看起来密码也在此处传递。我错过了什么吗?还是我的原始答案(没有代码)具有误导性?
    • 我可能误解了您最初建议的解决方案。您必须使用密码创建一个凭据才能重新进行身份验证,但只要您向用户索取并且不将其存储在设备上,您就可以开始了。
    猜你喜欢
    • 2018-07-24
    • 2018-01-18
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 2016-06-27
    • 2018-08-10
    相关资源
    最近更新 更多