【发布时间】:2019-07-03 09:07:08
【问题描述】:
我在使用FirebaseApp(第 3 方 API)生成身份验证令牌时遇到困难,该令牌可以传递到侧边栏并由客户端用于登录和访问我的 Firebase 数据库客户端。
我正在尝试使用this tutorial,但如果不使用makeToken() 中的数据库机密(正在折旧),它就无法正常工作。我更喜欢使用this tutorial 中反映的服务帐户。当我查看生成的令牌之间的差异时,前 2 个由“。”分隔。是相同的,最后一个'.'之后的最后一块。是不同的。长度也是一样的。例如:
//Example Generated by Database Secret: TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBv.ZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=.dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2U=
//Example Generated by Service Account: TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBv.ZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=.IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbml=
我可以生成 OAuth 访问令牌,将其传递给 FirebaseApp 并生成身份验证令牌,但是当它通过客户端并尝试进行身份验证时,我收到错误:Login Failed! Error: INVALID_TOKEN: Failed to validate MAC.
似乎有很多关于如何做到这一点的错误信息和相互矛盾的信息。
我有一个 getFirebaseService() 函数服务器端,它使用 Apps Script OAuth2 库来获取访问令牌。
function getFirebaseService() {
return OAuth2.createService('Firebase')
// Set the endpoint URL.
.setTokenUrl('https://accounts.google.com/o/oauth2/token')
// Set the private key and issuer.
.setPrivateKey(fb_PRIVATE_KEY) //Service account private key
.setIssuer(fb_SERVICE_EMAIL) //Service account email
// Set the property store where authorized tokens should be persisted.
.setPropertyStore(PropertiesService.getScriptProperties())
// Set the scopes.
.setScope('https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/firebase.database');
}
我有一个makeToken() 函数服务器端,它使用 OAuth 访问令牌从 Firebase 获取身份验证令牌。我我能够在服务器端使用service.getAccessToken() OAuth 令牌来访问和存储数据。所以这行得通,我想我的问题是创建一个更具限制性的客户端身份验证令牌。
function makeToken(){
var service = getFirebaseService();
if (service.hasAccess()) {
return FirebaseApp.getDatabaseByUrl(fb_URL, service.getAccessToken()) //Database Secret Works: "AAslhfi3MYACCESSTOKEN2930hf03ah4th8" but is being depreciated.
.createAuthToken(Session.getActiveUser().getEmail());
} else {
Logger.log("makeToken: " + service.getLastError());
}
}
然后在客户端,从侧边栏,我尝试使用从makeToken() 检索到的自定义身份验证令牌进行身份验证。
var userAuthToken;
google.script.run.withSuccessHandler(function (requestAuthToken) {
userAuthToken = authenticateClient(requestAuthToken)
}).makeToken();
function authenticateClient(userRequestToken) {
var ref = new Firebase(fb_URL);
ref.authWithCustomToken(userRequestToken, function (error, authData) {
if (error) {
console.log("FB Login Failed!", error); //Error below come from here.
}
else {
console.log("FB Login Succeeded!", authData);
}
});
return ref.authData.auth;
}
这导致Login Failed! Error: INVALID_TOKEN: Failed to validate MAC.。
编辑: FirebaseApp 是否有可能是 incorrectly generating JWT 身份验证令牌?
Edit2:我认为上述编辑不太可能,因为我尝试使用 GSApp library 并遇到了同样的问题。它似乎只需要折旧的数据库机密,而不是服务帐户 OAuth。
【问题讨论】:
标签: firebase google-apps-script