gpt4 book ai didi

angular - firebase 中的 Google 身份验证显示空白屏幕 Progressive Web App

转载 作者:太空狗 更新时间:2023-10-29 16:56:53 24 4
gpt4 key购买 nike

我正在创建我的第一个使用 firebase 存储数据的渐进式网络应用程序。我还使用 Gmail 作为所有将使用该应用程序的用户的入口点。但是我坚持执行登录。下面是我的登录代码:

html:

<button md-raised-button color="warn" (click)="logInGoogle()"><md-icon>group</md-icon>Sign in with google to enjoy the app</button> 

:

logInGoogle(){
this.authService.loginWithGoogle().then( user => {
console.log("User is logged in");
//this.router.navigate(['/addweather']);
})
.catch( err => {
console.log('some error occured');
})
}

这是服务:

loginWithGoogle() {
return this.afAuth.auth.signInWithPopup(new firebase.auth.GoogleAuthProvider());
}

还要检查 auth 状态,我在 app.component.ts 构造函数中有这个:

this.authService.afAuth.authState.subscribe(
(auth) => {
if(auth === null){
console.log("Not Logged in.");
this.router.navigate(['login']);
this.isLoggedIn = false;
}
else {
console.log("Successfully Logged in.");
this.isLoggedIn = true;
this.router.navigate(['']);
}
}
)

现在应用程序显示了一些行为:

  1. 此登录功能在浏览器上运行良好,因为如果我单击登录按钮,它会打开一个新窗口,授权我并返回到打开该应用程序的同一选项卡。

    <
  2. 当我将应用程序添加到主屏幕并尝试再次登录时,它会提示我选择以下选项:

enter image description here

单击 chrome 后,它会授权我并将我重定向到该应用程序,但该应用程序现在显示空白屏幕,而 oAuth 屏幕只是进入无限处理状态。 为什么会这样?我的意思是它不应该像在浏览器中运行应用程序时那样以正常方式工作。

同样在单击登录按钮时,它不应提示如上图所示的选项;相反,它应该打开一个 oAuth 对话框。我也尝试使用以下代码执行此操作:

logInGoogle(){
var newWindow = window.open('https://accounts.google.com/o/oauth2/auth?scope=https://www.google.com/m8/feeds&client_id=9722-j3fstr5sh6pumie.apps.googleusercontent.com&redirect_uri=https://weatherapp321.firebaseapp.com/__/auth/handler&response_type=token', 'name', 'height=600,width=450');

}

现在这不是提示选项,而是打开一个所需的对话框。但是在授权之后,这让我回到了登录页面。 为什么会这样?当我已经在 app.component.ts 中检查身份验证状态并在用户获得授权时将用户重定向到主页。

感谢您耐心阅读到最后。非常感谢您的帮助。

编辑

正如 Yevgen 所建议的:尝试使用 signInWithRedirect。当我第一次登录时它工作了 2 秒的轻微延迟。但是后来我注销并尝试再次登录,登录后出现黑屏。

最佳答案

我在我的宠物网络应用程序上有几乎相同的行为。对于我自己,我通过以下步骤解决它:

  1. 我将 firebase 初始化移动到 app.module.ts

@NgModule({
...
providers: [
{ provide: APP_INITIALIZER, useFactory: appConfig, deps: [AuthService], multi: true }
]
})

export function appConfig(authService) {
const app = firebase.initializeApp({
apiKey
authDomain
});
return () => new Promise((resolve, reject) => {
firebase.auth()
.onAuthStateChanged(data => {
if (data) {
firebase.auth().currentUser.getToken()
.then((token: string) => authService.setToken(token););
}
resolve(true);
}, error => resolve(true));
});
}

  1. 重定向到我在 auth.guard.ts 中管理的登录页面

export class AuthGuard implements CanActivate {
constructor(
private authService: AuthService,
private router: Router
) {}

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
if (this.authService.isAuthenticated()) {
return true;
} else {
this.router.navigate(['/signin']);
return false;
}
}
}

  1. 我的 auth.service.ts 中有下一个代码

export class AuthService {
token: string;

signinUser(email: string, password: string) {
return new Promise((resolve, reject) => {
firebase.auth().signInWithEmailAndPassword(email, password)
.then(resp => {
firebase.auth().currentUser.getToken()
.then((token: string) => {
this.token = token;
resolve(resp);
}).catch(reject);
return resp;
})
.catch(reject);
});
}

signoutUser() {
return firebase.auth().signOut()
.then(resp => this.token = null);
}

getToken() {
firebase.auth().currentUser.getToken()
.then((token: string) => this.setToken(token));
return this.token;
}

setToken(token) {
this.token = token;
}

isAuthenticated() {
return this.token != null;
}
}

希望对您有所帮助。

关于angular - firebase 中的 Google 身份验证显示空白屏幕 Progressive Web App,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46570311/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com