firebase 提供者身份验证刷新流程

时间:2021-07-09 09:01:50

标签: javascript firebase firebase-authentication

我正在尝试使用 firebase 身份验证来获取 google 访问令牌,以便调用 youtube API。

我最初能够像这样获得访问令牌:

const provider = firebase.auth.GoogleAuthProvider();
cosnt scopes = []; // ...scopes
scopes.forEach(scope => provider.addScope(scope));

firebase.auth().signInWithPopUp(provider)
  .then(userCredentials=> {
    const oauthCredentials = userCredentials.credentials;
    // using credentials for API calls
    axios.get("some-google-api-path", { params: { access_token: oauthCredentials.accessToken } }); // and so on...
  });

这可以正常工作,直到访问令牌过期。 据我所知,firebase 似乎会自动刷新会话,但我可以找到一种方法来获取新的访问令牌。

我试过了:

firebase.auth().onAuthStateChange(user => {
  // could not find the access token on the user object
});

由于失败,我尝试使用以下方法手动完成:

const token = firebase.auth.GoogleAuthProvider.credential(
  oauthCredentials.idToken,
  oauthCredentials.accessToken
);

const authResult = await firebase.auth().signInWithCredential(token);

问题是 authResult 将只包含 idTokenaccessToken,但不能同时包含两者,这取决于我给 firebase.auth.GoogleAuthProvider.credential 函数提供了什么。

我错过了什么吗? 还有其他/更好的方法吗?

2 个答案:

答案 0 :(得分:1)

这里有两个令牌在起作用:

  • 刷新令牌,仅在用户主动登录后可用。由于它不会更改,因此您可以缓存此令牌 - Firebase SDK 实际上也这样做。
  • 当前用户随时可用的 ID 令牌。此令牌会在一小时后过期,并由 Firebase SDK 自动刷新。

因此,如果您想保留对刷新令牌的访问权限,则必须在用户首次主动登录时自行存储(通常在本地存储中)。

答案 1 :(得分:0)

很明显,根据 this(谢谢Frank van Puffelen!)

所以我所做的是手动向 google 进行身份验证(因为我使用的是 react,所以我使用了 react-google-login),并从那里获取了所有令牌。

然后,一旦会话启动/刷新,我会使用以下方法创建 firebase 会话:

const token = firebase.auth.GoogleAuthProvider.credential(
  oauthCredentials.idToken,
  oauthCredentials.accessToken
);

const authResult = await firebase.auth().signInWithCredential(token);

我希望这对任何人都有帮助,如果 firebase 改变了这一点,我会接受另一个答案。