我正在尝试使用 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
函数提供了什么。
我错过了什么吗? 还有其他/更好的方法吗?
答案 0 :(得分:1)
这里有两个令牌在起作用:
因此,如果您想保留对刷新令牌的访问权限,则必须在用户首次主动登录时自行存储(通常在本地存储中)。
答案 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 改变了这一点,我会接受另一个答案。