gpt4 book ai didi

Firebase 服务帐户生成身份验证 token 供客户端使用 Google Apps 脚本

转载 作者:行者123 更新时间:2023-12-04 13:01:59 31 4
gpt4 key购买 nike

我在使用 FirebaseApp 时遇到困难(第 3 方 API)生成身份验证 token ,该 token 可以传递到侧边栏并由客户端用于登录和访问我的 Firebase 数据库客户端。

我正在尝试使用 this tutorial但如果不使用 makeToken() 中的数据库 secret (正在折旧),则无法使其工作.我更喜欢使用 this tutorial 中反射(reflect)的服务帐户.当我查看生成的 token 之间的差异时,前 2 个部分由 '.' 分隔。是相同的,最后一个 '.' 之后的最后一块。是不同的。长度也是一样的。例如:

//Example Generated by Database Secret: TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBv.ZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=.dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2U= 
//Example Generated by Service Account: TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBv.ZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=.IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbml=

我可以生成 OAuth 访问 token ,将其传递给 FirebaseApp 并生成一个身份验证 token ,但是当它传递到客户端并尝试进行身份验证时,我收到一个错误: Login Failed! Error: INVALID_TOKEN: Failed to validate MAC.
似乎有很多关于如何做到这一点的错误信息和相互矛盾的信息。

我有一个 getFirebaseService()使用 Apps Script OAuth2 库获取访问 token 的服务器端函数。
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 访问 token 从 Firebase 获取身份验证 token 的功能服务器端。我 上午 能够使用 service.getAccessToken() OAuth token 服务器端访问和存储数据。所以这是有效的,我想我的问题是创建一个更具限制性的客户端身份验证 token 。
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() 检索服务器端的自定义身份验证 token 进行身份验证.
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 身份验证 token ?

编辑 2:我认为上述编辑不太可能,因为我试图使用 GSApp library并有同样的问题。它似乎只想要折旧的数据库 secret ,而不是服务帐户 OAuth。

最佳答案

好吧,经过漫长的一天,我想通了。我将列出我最终用于库的内容以及问题是什么(参见第三个库)。主要问题本质上是教程已经过时,并且没有很多人在应用程序脚本中使用 Firebase。

OAuth2(服务器端)
Link

我不需要在这里改变任何东西!它工作正常,从来没有问题。

FirebaseApp(服务器端)
Link

这是一个不错的库,我坚持使用它,因为它运行良好(一旦我到了那里)。我不得不对来自 tutorial 的原始代码进行更改。我提到。我的代码最终像这样并且工作:

if (service.hasAccess()) {   
return FirebaseApp.getDatabaseByUrl(fb_URL, service.getAccessToken()) //get OAuth Token
.createAuthToken(Session.getEffectiveUser().getEmail(), null, serviceAccount.client_email, serviceAccount.private_key);
//... Added the null, private key, and service email parameters.

Firebase(客户端)
Link

好的,那么 这是我的主要问题 -- tutorial我遵循的客户端设置是 .我不得不 upgrade the code我自己使用新的 3.x 版本:
<script src="https://www.gstatic.com/firebasejs/5.8.2/firebase.js"></script>

// Initialize Firebase
var config = {
apiKey: "<Web API Key>",
authDomain: "<Project ID>.firebaseapp.com",
databaseURL: "https://<DB URL>.firebaseio.com/"
};

firebase.initializeApp(config);

有了这个 firebase例如我能够更新我原来的 authenticateClient()方法:
function authenticateClient(userRequestToken) {
firebase.auth().signInWithCustomToken(userRequestToken).catch(function(error) {
// Handle Errors here.
console.error("authClient: ", error.code, error.message);
});

return {
uid: firebase.auth().currentUser.uid,
metadata: {
lastSignInTime: firebase.auth().currentUser.lastSignInTime
}
};
}

就是这样!我现在有一个 firebase使用 JWT 自定义 token 登录用户的实例!我遇到了一些有类似问题的人,我希望这会有所帮助。

关于Firebase 服务帐户生成身份验证 token 供客户端使用 Google Apps 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54604004/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com