我正在尝试使用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
功能。
我错过什么了吗?还有其他/更好的方法吗?
2条答案
按热度按时间oxalkeyp1#
这里有两个代币:
刷新令牌,仅在用户主动登录后可用。因为它不会改变,所以你可以缓存这个令牌——firebase SDK实际上也是这样做的。
id令牌,当前用户可随时使用该令牌。此令牌将在一小时后过期,并由firebase SDK自动刷新。
因此,如果您希望保留对刷新令牌的访问权,则必须在用户首次主动登录时存储(通常在本地存储中)。
1bqhqjot2#
因此,显然firebase不会根据这一点(谢谢frank van puffelen!)
因此,我所做的是手动向google进行身份验证(因为我使用react,所以我使用react google登录),并从那里获取所有令牌。
然后,一旦启动/刷新会话,我将使用以下方法创建firebase会话:
我希望这对任何人都有帮助,如果firebase改变了这一点,我将接受另一个答案。