我正在使用AngularJS,Firebase(SDK v3)和Google Calendar API构建Web应用程序。我正在使用Google OAuth对用户进行身份验证。我的目的是能够从Firebase中的数据库节点创建日历事件。到目前为止,我已设法请求访问日历范围:
_authProvider = new firebase.auth.GoogleAuthProvider();
// Get permission to manage Calendar
_authProvider.addScope("https://www.googleapis.com/auth/calendar");
_fbAuthObject.signInWithRedirect(_authProvider);
我使用重定向流进行身份验证,因此身份验证重定向可用:
_fbAuthObject.getRedirectResult()
.then(function _readToken(result) {
if (result.credential) {
_googleToken = result.credential.accessToken;
var authHeader = 'Bearer '+ _googleToken;
// Just a test call to the api, returns 200 OK
$http({
method: 'GET',
headers: {
'Authorization': authHeader
},
url: 'https://www.googleapis.com/calendar/v3/users/me/calendarList/primary'
})
.then(function success(response) {
console.log('Cal response', response);
},
function error(response) {
console.log('Error', response);
});
但是,似乎在初次登录之外,无法通过Firebase SDK获取Google访问令牌。似乎只能访问Firebase JWT令牌,而不能使用Calendar API。我可以存储访问令牌,但在刷新令牌等时无法解决问题。有没有办法通过Firebase SDK获取当前的Google Access令牌,如果没有,那么还有哪些其他解决方案可以解决问题无需两次验证用户?
更新1:
似乎像someone else has struggled with similar problems with Facebook authentication。在该问题上,有link to the Firebase documentation表示Firebase身份验证不再保留访问令牌。那么我该如何处理令牌刷新?真的没有答案吗?
更新2:
因此,我与Firebase支持部门就此问题提出了功能请求,他们给了我以下答案:
感谢您抽出宝贵时间给我们写信。
我已经明确了你的观点,这确实是一个很好的建议。我们非常清楚许多用户(例如您自己)希望在刷新时访问令牌的OAuth功能。我们正在探索潜在的解决方案,但我不能保证这是否会很快就可以使用。我们会继续考虑您的反馈意见。持续改进对我们的社区非常重要,所以感谢您提出这一点!
请留意我们的发行说明,了解任何进一步的更新。
因此,目前似乎无法通过Firebase SDK获取访问令牌。我仍然在努力寻找解决方法,所以如果有人对有效解决方案有任何想法,我很高兴听到它们。当然,如果我自己找到一个可行的解决方案,我会在这里发帖。
答案 0 :(得分:6)
我终于通过使用Google API JavaScript客户端处理Firebase外部的身份验证来解决此问题。此解决方案要求将Google身份验证客户端包含为documented here。手动处理Firebase登录流程已记录在here。
gapi.auth2.getAuthInstance().signIn()
.then(function _firebaseSignIn(googleUser) {
var unsubscribe = firebase.auth().onAuthStateChanged(function(firebaseUser) {
unsubscribe();
// Check if we are already signed-in Firebase with the correct user.
if (!_isUserEqual(googleUser, firebaseUser)) {
// Build Firebase credential with the Google ID token.
var credential = firebase.auth.GoogleAuthProvider.credential(
googleUser.getAuthResponse().id_token);
// Sign in with credential from the Google user.
return firebase.auth().signInWithCredential(credential)
.then(function(result) {
// other stuff...
});
_isUserEqual函数:
function _isUserEqual(googleUser, firebaseUser) {
if (firebaseUser) {
var providerData = firebaseUser.providerData;
for (var i = 0; i < providerData.length; i++) {
if (providerData[i].providerId === firebase.auth.GoogleAuthProvider.PROVIDER_ID &&
providerData[i].uid === googleUser.getBasicProfile().getId()) {
// We don't need to reauth the Firebase connection.
return true;
}
}
}
return false;
}
现在我可以像这样引用访问令牌:
var user = gapi.auth2.getAuthInstance().currentUser.get();
return user.getAuthResponse().access_token;
这对我来说仍然不是理想的解决方案,但它现在可以使用,我可以对Firebase和Calendar API进行身份验证。