首页 > 解决方案 > Angular 和 FireBase 问题

问题描述

我使用 fireBase Rest API 登录和登录。由于某种原因,当我订阅登录的 POST REQUEST 时,我得到的响应与 FireBase 文档显示的不同。它给了我没有 expiresIn 的响应。由于登录效果很好,我找不到任何解决方案,谢谢

这是我的身份验证服务

   import { User } from './user.model';
    import { Injectable } from '@angular/core';
    import { HttpClient, HttpErrorResponse } from '@angular/common/http';
    import { catchError, tap } from 'rxjs/operators';
    import { throwError, BehaviorSubject } from 'rxjs';

    export interface AuthResponseData{
    kind: string;
    idToken:string;
    email:string;
    refreshToken:string;
    expiresIn: string;
    localId: string;
    registered?: boolean;

    }

    @Injectable({
    providedIn: 'root'
    })
    export class AuthService {

     user = new BehaviorSubject<User>(null);
     constructor(private Http: HttpClient) { }

     signUp(email:string, password:string){
     return this.Http.post<AuthResponseData>('https://identitytoolkit.googleapis.com/v1/accounts:signUp? 
     key=xxxxxxxxxxxxxxxxxxxxxxx',
     {email : email,password: password, returnSourceToken : true}).
     pipe(catchError(this.errorHandler),
     tap(resData=>{
      console.log(resData);
      this.authHandler(resData.email,resData.localId,resData.idToken,+resData.expiresIn);}));
     }

在登录方法中,我得到了没有 expiresIn 的响应,但文档说我应该得到它

     login(email:string,password:string){
     return this.Http.post<AuthResponseData> 
     ('https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword? 
     key=xxxxxxxxxxxxxxxxxxx',
    {email : email, password: password,returnSourceToken : 
    true}).pipe(catchError(this.errorHandler),tap(resData=>{
      console.log(resData);
      this.authHandler(resData.email,resData.localId,resData.idToken,+resData.expiresIn)

      }));
     }


  private authHandler(email:string,userId:string,token:string,expiresIn:number){
    const expDate = new Date(new Date().getTime()+ expiresIn * 1000)
    const user = new User(email,userId,token,expDate);

   this.user.next(user);
  }


  private errorHandler(errorResponse: HttpErrorResponse){
    let errMsg ='Some error occurred';
    if(!errorResponse.error || !errorResponse.error.error.message){
      return throwError(errMsg)
    }
    switch(errorResponse.error.error.message){
      case 'EMAIL_EXISTS':
        errMsg = 'Email Already Exsits';
        break
        case 'INVALID_PASSWORD':
          errMsg = 'Wrong password';
          break
          case 'EMAIL_NOT_FOUND':
            errMsg = 'Email was not found'
            break
    }
    return throwError(errMsg)
  }
}

标签: javascriptangularfirebase

解决方案


您发送到发布请求的对象中似乎有错字

你用过returnSourceToken,应该是returnSecureToken

所以你传递给帖子的对象应该是

{
  email: email,
  password: password,
  returnSecureToken: true
}

在此处查看 firebase 文档 https://firebase.google.com/docs/reference/rest/auth#section-create-email-password


推荐阅读