我已在Python中编写了多个Google Cloud Endpoints,并{{}}}要求对他们的调用来自使用Firebase进行身份验证的用户。我需要使用JavaScript从Web应用程序调用我的终端,但我似乎无法使身份验证正常工作。
我想使用followed the directions(gapi),它带来了从提供的发现文档动态生成客户端库的额外好处。当我尝试使用gapi客户端时,我可以很好地调用我的API,但是我得到一个HTTP 401作为响应,以及我的python源返回的HTTP未授权消息。
Google关于此主题的文档相当稀少。我从Google APIs client收集可以使用标准的Ajax调用,但是我没有看到有关如何从Gapi调用Firebase认证端点的任何文档。我目前担心的是,可能尚未设置gapi客户端(允许)使用发现文档,并允许将Authorization
标头设置为Firebase Auth所需。
我尝试的甚至可能吗?
任何建议将不胜感激。也许使用gapi客户端无法调用Firebase Authenticated端点。
这是我的gapi js代码的大致轮廓:
function(token) {
gapi.client.init({
apiKey: 'MY_API_KEY',
discoveryDocs: [MY_DISCOVERY_DOC_URL'],
clientId: 'MY_WEB_CLIENT_ID',
scope: 'profile'
}).then(function(){
return gapi.client.my.server.api.call();
}).then(function(response){
console.log(response.result.data)
}, function(reason){
console.log('Error: ' + reason.result.error.message)
});
}
答案 0 :(得分:0)
我一直在努力解决这个问题,最后让它发挥作用。我找到了两个选择:
选项1)如果要使用gapi.client库: 有一个名为gapi.client.setToken(tokenObject)的方法 - documentation
然而,它似乎是新的(7月和17号),并且几乎没有文档或示例。我做了以下工作(这是在angularJS与angular-fire但我希望你得到我正在做的事情,基本上忽略" $范围")
// any time auth state changes, add the user data to scope
$scope.auth.$onAuthStateChanged(function (firebaseUser) {
$scope.firebaseUser = firebaseUser;
$scope.idToken = null;
// get the token from the firebase User Object
// Note that getToken() is deprecated and for me it did not work as desired
// use getIdToken() instead
firebaseUser.getIdToken().then(function (idToken) {
$scope.idToken = idToken;
});
});
// Now you can use setToken
// If from the docs you were thinking firebase's getIdToken() gives me TokenObject and gapi's setToken()
// expects a TokenObject so I'll just pass it - you'd be wrong! (at least for me - if it works for you please give me a heads up)
// You'll need to build your own token:
var homemadeToken = {
access_token: $scope.idToken.toString() // This feels so wrong
};
gapi.client.setToken(homemadeToken);
gapi.client.yourapi.getSomething().execute(function (resp) {
// Do stuff with the response
}
);
选项2)使用jQuery的Ajax请求 - documentation
$.ajax(backendHostUrl + '/_ah/api/yourapi/v1/someendpoint', {
headers: {
'Authorization': 'Bearer ' + $scope.idToken // Here it worked without making a string first but I did not check why
},
method: 'GET',
success: function (resp) {
// Do stuff with the response
}
});
如果您的后端仍然不接受令牌并且您已从端点v1迁移到v2,那么它可能会有所帮助migrating again as described here。 ESP。确保再次创建lib文件夹。 即使在SDK更新之后,我也注意到,如果你从v1迁移到v2,那么" lib"文件夹永远不会更新,无论它是否已更新。
仍然无法使用? 这个github page修复了早期版本的BACKEND方面的问题 - 后端不接受firebase令牌,需要被黑客入侵。如果您要应用此处所述的更改,并且您正在使用最新的" lib"根据迁移指南,文件夹(写于7月和17日)users_id_token.py,请注意该文件已更改,您需要违反该文件中的显式注释_verify_signed_jwt_with_certs方法:
# Formerly we would parse the token body here.
# However, it's not safe to do that without first checking the signature.
并在检查签名之前解析令牌。从该文件的评论可以推断,谷歌计划将整个逻辑放在其他地方 - 希望firebase友好且安全。