如何从Javascript调用Firebase身份验证的Cloud Endpoint?

时间:2017-03-09 06:09:52

标签: javascript python google-app-engine firebase google-cloud-endpoints

我已在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)
        });
    }

1 个答案:

答案 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友好且安全。