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

t2a7ltrp  于 2021-09-23  发布在  Java
关注(0)|答案(2)|浏览(429)

我正在尝试使用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 将只包含 idToken 或者 accessToken ,但不是两者都有,这取决于我给出的答案 firebase.auth.GoogleAuthProvider.credential 功能。
我错过什么了吗?还有其他/更好的方法吗?

oxalkeyp

oxalkeyp1#

这里有两个代币:
刷新令牌,仅在用户主动登录后可用。因为它不会改变,所以你可以缓存这个令牌——firebase SDK实际上也是这样做的。
id令牌,当前用户可随时使用该令牌。此令牌将在一小时后过期,并由firebase SDK自动刷新。
因此,如果您希望保留对刷新令牌的访问权,则必须在用户首次主动登录时存储(通常在本地存储中)。

1bqhqjot

1bqhqjot2#

因此,显然firebase不会根据这一点(谢谢frank van puffelen!)
因此,我所做的是手动向google进行身份验证(因为我使用react,所以我使用react google登录),并从那里获取所有令牌。
然后,一旦启动/刷新会话,我将使用以下方法创建firebase会话:

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

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

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

相关问题