javascript - 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)
}
}
解决方案
您发送到发布请求的对象中似乎有错字
你用过returnSourceToken
,应该是returnSecureToken
所以你传递给帖子的对象应该是
{
email: email,
password: password,
returnSecureToken: true
}
在此处查看 firebase 文档 https://firebase.google.com/docs/reference/rest/auth#section-create-email-password
推荐阅读
- python - 如何从离线 plotly python jupyter notebook 中的选定点获取数据?
- raspberry-pi3 - 工业高负载能力单板建议
- sql - 基于另一列创建新的值列
- mysql - 如何从一张表中只插入一列到多列表中?
- python - 从python中的方法返回一个值
- hyperledger-fabric - 如何在超级账本作曲家中自动增加资产 ID?
- python - 在python中删除CSV文件的特定行
- asp.net - ASP.Net Core MVC asp-validation-summary 样式
- c# - 如何用 c# 替换 JPanel
- python - 将文件一一传递给python脚本(Windows上的XARGS?FORFILES?)