angular / angular/angularfire

getRedirectResult() always returns null - Unable to retrieve idToken after signInWithRedirect()

Đang mở
#3,335 19 bình luận 6 reaction 0 người được giao Xem trên GitHub
comp: auth needs: recheck type: bug version: legacy (v7-v16)
Ngôn ngữ chính
TypeScript
Star
7.8k
Fork
2.2k
Merge trung bình
22 giờ 28 phút
Pull request đã merge (30 ngày)
6

Mô tả

### Version info

**Angular:** 15

**Firebase:** 9

**AngularFire:** 7.5.0

### How to reproduce these conditions

**Steps to set up and reproduce**

> Note: I am testing this locally and on a mobile device. In both cases I am using Chrome. The application is hosted locally running `ng serve --watch --ssl --host 0.0.0.0` which means the SSL certificate is not valid. I mention this in case it is relevant.

I'm simply calling `signInWithRedirect()` and install an `APP_INITIALIZER` provider to make sure the `idToken` is loaded as the app starts.

However, the `idToken` (as well as the `credentials`) are always `null`/`undefined` and I have no idea why. Could be related to (https://github.com/angular/angularfire/issues/3208).

```typescript
public signInWithGoogle() {
return signInWithRedirect(this.auth, new GoogleAuthProvider());
}
```

```typescript
export const AUTH_ID_TOKEN_INITIALIZER_PROVIDER: Provider = {
provide: APP_INITIALIZER,
deps: [NGXLogger, AuthService],
multi: true,
useFactory: (logger: NGXLogger, authService: AuthService) => {
return async () => {
logger.info("Initializing App: Waiting for (API) idToken");
const credentials = await getRedirectResult(authService.auth);
console.log(credentials); // Is already null
const idToken = await credentials?.user.getIdToken();
console.log(idToken);
if (idToken) {
return idToken;
}
await authService.init(); // <-- Implementation below (put it here for testing)
return firstValueFrom(authService.idToken$);
}
},
};
```

I tried a different approach after reading that we have to wait for `onAuthStateChanged()` to fire and only after that we're supposed to fetch the `idToken`. The implementation looked like this (with the same result however):

```typescript
async init() {
this.logger.debug("Checking for token from redirect");
const credentials = await getRedirectResult(this.auth);
this.idToken = await credentials?.user.getIdToken();

await this.auth.onAuthStateChanged(
async () => {
const credentials = await getRedirectResult(this.auth);
this.idToken = await credentials?.user.getIdToken();
console.log("inner");
console.log(this.idToken);
}
);
console.log("outer");
console.log(this.idToken);
}
```

### Expected behavior

Receive a valid `idToken` after beind redirected.

### Actual behavior

Credentials & token are `null` / `undefined`.

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Hướng nghiên cứu

Bắt đầu bằng cách tái hiện luồng redirect với Angular 15, Firebase 9 và AngularFire 7.5.0, tập trung vào signInWithRedirect(), getRedirectResult(), APP_INITIALIZER và onAuthStateChanged(). Theo dõi thời điểm getRedirectResult() được gọi và xác minh việc hoàn tất bằng cách nhận một credential hợp lệ và idToken sau redirect.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
angular, firebase, typescript
Lĩnh vực
authentication
Loại issue
Lỗi
Độ khó
3/5
Thời gian dự kiến
1-2 ngày
Mức độ hoạt động
Ít trao đổi
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
48/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.