天道酬勤,学无止境

How would I return a Firebase custom token if the generation of the custom token is asynchronous?

I'm using the Spark Framework hosted on Heroku and I have this in my main: method in my server

post("/token", (request, response) -> "Hello World");

That's working fine, however, I want to actually send a custom token, and not just "Hello World".

So, logically, I would need this:

FirebaseAuth auth = FirebaseAuth.getInstance();
String uid = UUID.randomUUID().toString();
post("/token", (request, response) -> auth.createCustomToken(uid));

However, createCustomToken returns a Task<String> and not a String. So, I have to do:

auth.createCustomToken(uid).addOnSuccessListener(new OnSuccessListener<String>() {
            @Override
            public void onSuccess(String s) {

            }
        });

However, in this form:

post("/token", (request, response) -> auth.createCustomToken(uid).addOnSuccessListener(new OnSuccessListener<String>() {
            @Override
            public void onSuccess(String token) {

            }
        }));

All I really still returned was a Task<String>. I need to return token from the onSuccess() method, but I can't since it's an inner class.

What can I do to solve this?

评论

I was running into a similar problem at Google App Engine. I had to verify a firebase token at server side but the response were sent back async from firebase. ( Verify Firebase Token at Google App Engine)

You can try the following code instead of using a OnSuccesListener

Task<String> authTask = FirebaseAuth.getInstance().createCustomToken(uid);

try {
    Tasks.await(authTask);
} catch (ExecutionException | InterruptedException e ) {
    log.severe(e.getMessage());
}

String myToken = authTask.getResult();

This worked for me:

FirebaseAuth.getInstance().createCustomTokenAsync(UID).get()

It returns a custom token in a string. Got it from https://www.youtube.com/watch?v=Fi2dv6NcHWA

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 使用 Microsoft Azure / Graph 进行 Firebase 自定义身份验证(Firebase custom Auth with Microsoft Azure / Graph)
    问题 我正在构建一个使用 Microsoft Graph 登录的企业应用程序。成功签名后,我想使用要发送的令牌对 Firebase Auth 进行身份验证(这样我就可以保护对数据库的访问)。 成功登录后收到的令牌不能直接用于 Firebase。 在 Firebase 自定义身份验证说明页面上,它说: 获取项目的服务器密钥: 转到项目设置中的“服务帐户”页面。 单击服务帐户页面 Firebase Admin SDK 部分底部的生成新私钥。 新服务帐户的公钥/私钥对会自动保存在您的计算机上。 将此文件复制到您的身份验证服务器。 第三点说你需要输入认证服务器的密钥。 这可以使用Microsoft Graph或Azure AD吗? Firebase 为您提供的密钥是一个JSON文件。 我检查了Microsoft App 注册门户,它允许您编辑应用程序清单,但没有运气。 JSON文件如下所示: { "type": "service_account", "project_id": "APP_ID", "private_key_id": "KEY_ID_VALUE", "private_key": "-----BEGIN PRIVATE KEY----<KEY VALUE>-----END PRIVATE KEY-----\n", "client_email": "firebase
  • 如何在 Firebase 3.xx 中处理自定义 Firebase 令牌到期(How to handle custom firebase token expiry in Firebase 3.x.x)
    问题 我已经使用“ signInWithCustomToken() ”来验证firebase用户。 此令牌将在 1 小时后过期。 Firebase 建议令牌过期时间为 1 小时。 如果我们在使用“php-jwt”库创建自定义令牌时修改了过期时间,firebase 会抛出异常“自定义令牌格式不正确。请检查文档”。 在搜索解决方案时,我发现了以下线程-“Firebase Android 身份验证失败:expired_token(身份验证令牌已过期)” 但是“ onTokenRefresh() ”返回的刷新令牌对我不起作用。 刷新此自定义令牌的程序是什么? 或者 有没有办法将手动到期设置为自定义令牌? 回答1 Firebase 自定义令牌生成存在限制。 Firebase 自定义身份验证令牌限制为最长 1 小时(3600 秒)。 exp令牌到期的时间(以秒为单位)。 它最多可以比 iat 晚 3600 秒。 如果 auth token 每小时过期一次,我们就很难一直保持有效的 session :( 当我们使用默认的 Auth 提供程序时,例如(Google、Facebook、Email..); 默认情况下,Firebase SDK 会负责刷新您的 Auth 令牌。 但是在自定义身份验证中,Firebase SDK 需要联系 3rd 方服务器以获取新令牌。 这里只有 SDK 无法刷新令牌!
  • 如何在 Firebase 3.0 中的应用程序之间共享身份验证令牌?(How to share Authentication token between app in Firebase 3.0?)
    问题 在旧版本的 Firebase 中,我们可以获得经过身份验证的令牌,以便在我们的应用程序、扩展程序之间共享。 但是当升级到 Firebase 3.0 时,该功能不再起作用。 我在 FIRUser 上使用了 getTokenWithCompletion:,然后在我的 App Extension 中,我用我刚获得的令牌调用了 signInWithCustomToken:completion: 。 但 Firebase 返回一个带有消息的错误: 错误域=FIRAuthErrorDomain 代码=17000 “自定义令牌格式不正确。请检查文档。” 请检查文档。} 如何从 FIRUser 获取身份验证令牌以在我的应用程序扩展中重新对其进行身份验证? 回答1 signInWithCustomToken旨在与在您自己的服务器上铸造的您自己的令牌一起使用(在此处阅读更多信息)。 在应用程序的不同组件之间引导会话的最佳方式是在登录时共享用户的凭据并在所有组件之间执行引导。 例如,如果您使用 Facebook 登录,当您检索 facebook 访问令牌时,您必须将它从您的应用程序共享到您的扩展程序,然后在主应用程序和扩展程序中使用相同的令牌调用 signInWithCredential。 目前无法使用来自另一个 Firebase 应用实例的 v3.X SDK 将用户登录到 Firebase 应用
  • Firebase Admin SDK 的 Node.js 身份验证服务器 - JWT 验证问题(Node.js authentication server for Firebase Admin SDK - JWT validation issue)
    问题 我正在做一个项目,我们将在微服务架构中使用不同的服务,并且我们还想使用一些 Firebase 服务。 我正在开发一个身份验证服务器,该服务器将创建自定义 JWT,以用于 Firebase 以及其他 API 项目。 我们希望使用 Firebase Auth SDK 轻松与 FB、Google、Twitter 等集成,但我们需要用更多数据丰富用户的令牌。 因此,我的想法是创建一个使用 Firebase Admin SDK 来执行此操作的 Node.JS 身份验证服务器。 流程如下: 用户在客户端使用最喜欢的提供商登录如果登录成功,用户会收到来自 Firebase 的 JWT。 这被发送到身份验证服务器进行验证如果身份验证服务器可以使用管理 SDK 验证令牌,则创建一个包含更多数据的新自定义令牌,并将此新自定义令牌返回给客户端让客户端使用新的自定义令牌重新进行身份验证,并将其用于与 Firebase 以及我们的其他 API 项目(主要在 .NET Core 中)进行通信 步骤 1-3 工作正常。 尝试验证其他服务上的自定义令牌时会出现问题。 TL; DR :这里有两个问题: 验证使用 Firebase Node.JS Admin SDK 发布的自定义令牌时,我应该使用什么作为公钥? 从 Google 公开的 JWK 中提取的密钥,还是从用于签名的私钥中提取的密钥? 在 JWK
  • Node.js authentication server for Firebase Admin SDK - JWT validation issue
    I am working on a project where we are going to be using different services in a microservice architecture, and we would like to also use some Firebase services. I am working on an auth server that is going to mint custom JWT's for use in both Firebase, as well as the other API projects. We would like to use the Firebase Auth SDK to easily integrate with FB, Google, Twitter etc, but we need to enrich the user's token with more data. Therefore, my thought process is that I'd create a Node.JS auth server that uses the Firebase Admin SDK to do this. The flow would be as follows: User logs in with
  • Generating a custom auth token with a cloud function for firebase using the new 1.0 SDK
    As of firebase-admin@5.11.0 and firebase-functions@1.0.0 firebase-admin no longer takes in an application config when the app initializes. I had a firestore function that would generate a custom token using firebase-admin’s createCustomToken. Calling that function would generate a credential that I would pass into initializeApp in the credential attribute. How would I go about doing that now? Do I need to edit process.env.FIREBASE_CONFIG somehow and put the serialized credential there before calling initializeApp?
  • Cordova/Phonegap 中的 Firebase:使用应用内的电子邮件/密码登录?(Firebase in Cordova/Phonegap: Log in using Email/Password from within app?)
    问题 我正在从cordova 应用程序运行webview 并想对用户进行身份验证,我知道他们有OAuth 策略,但我需要使用电子邮件/密码组合。 我想保持简单,但最终可能不得不生成一个令牌。 打开一个 InAppBrowser 加载 Firebase 的身份验证流程使用此方法收听要完成的身份验证流程:http://blogs.telerik.com/appbuilder/posts/13-12-23/cross-window-communication-with-cordova%27s-inappbrowser 再次从 webview 中获取结果并将其插入到 webview firebase 实例中 我猜这是不可能的,因为安全。 我的应用程序正在使用亚马逊登录(必需),所以我的替代方法是: webview 使用我们的外部 url 加载 InAppBrowser 加载 Amazon 身份验证,然后为 Firebase 生成令牌 webview 侦听令牌并抓取它,将其存储在 localstorage 中 编辑:在使用用户名/密码登录的 firebase 文档中,我看到它返回会话令牌和authData对象中的更多信息:https://www.firebase.com/docs/web/guide/user- auth.html 然后我可以从该对象中获取所有信息并将其发送回cordova
  • 在 Firebase 9.0.0 API 中,如何检查用户是否具有有效的 Auth 会话?(In Firebase 9.0.0 API, how to check the user has valid Auth session or not?)
    问题 在旧版 Firebase API 中,我使用“mFirebase.getAuth().getExpires()”来验证用户会话。 但是在新的 Firebase 9.0.0 API 中,我找不到这样的验证。 现在我正在检查身份验证会话的可用性,如下所示, public static boolean hasValidAuthToken() { return FirebaseAuth.getInstance().getCurrentUser() != null ? true : false; } 如果令牌已过期,我该如何处理? 更新:实际上我正在做自定义身份验证。 在服务器端拥有 Firebase 服务器 sdk(java)。 默认情况下,身份验证令牌将在 1 小时后过期。 令牌过期后出现以下错误, D/ConnectionRetryHelper: Scheduling retry in 398ms D/PersistentConnection: pc_0 - Trying to fetch auth token D/PersistentConnection: pc_0 - Error fetching token: An internal error has occured. [ Internal error. ] D/PersistentConnection: pc_0 -
  • Firebase 身份验证与 AWS Cognito [关闭](Firebase authentication vs AWS Cognito [closed])
    问题 关闭。 这个问题是基于意见的。 它目前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑这篇文章用事实和引文来回答问题。 8 个月前关闭。 改进这个问题 我们正在使用 API Gateway 和 Lambda 在 AWS 上构建移动和 Web 应用程序,目前正在评估是否应该使用AWS Cognito或Firebase Auth 。 AWS Cognito 很好地集成到 API Gateway 和 Lamdba 中,例如,只有经过身份验证的用户才能执行某些 API 调用。 如果我们改用 Firebase 身份验证,是否可以达到相同的行为? 有什么好的或坏的经验吗? 回答1 我们也在做同样的事情。 我们从 Cognito 开始,后来迁移到 Firebase,因为我们对 AWS Android SDK 与 Google 和 Facebook 实现身份验证流程的方式不满意:代码很旧,它使用了已弃用的方法,并且通常需要重写。 另一方面,Firebase 身份验证显然可以无缝工作。 当您不使用 Cognito 时,您需要在 AWS API Gateway 中实现您的自定义身份验证器,这非常简单,并在 https://aws.amazon.com/blogs/mobile/integrating-amazon-cognito-user-pools 中进行了描述-with-api
  • Firebase 自定义令牌身份验证(Firebase 版本 3)(Firebase custom token authentication (firebase version 3))
    问题 我有一个身份验证服务器 (NodeJS),我在其中对用户进行身份验证并创建自定义 firebase 令牌 var token = firebase.auth().createCustomToken(userId); 我曾经能够验证用户令牌(以前的版本),但现在不是那么简单...... 我想从令牌中获取解码的 userId firebase.auth().verifyIdToken(token).then(function).... 不适用于服务器生成的自定义令牌。 有谁知道如何做到这一点? 回答1 在这种情况下,您应该使用jsonwebtoken来验证令牌。 您只需要将 firebase 私钥作为附加参数传递即可。 var jwt = require('jsonwebtoken'); var fbPrivateKey = //your firebase key string here jwt.verify(token, fbPrivateKey, { algorithms: ['RS256'] }, function(err, decoded) { console.log(decoded); //your token info will be available here. }); 更新: 您必须使用您在firebase.initializeApp({设置的
  • Firebase Cloud Messaging-如何验证令牌?(Firebase Cloud Messaging - How to validate Tokens?)
    问题 我正在使用Firebase Cloud Messaging(FCM),并且每次在客户设备上生成新令牌时,都按照下面的缩写代码...将此新令牌发送到我的SERVER DB(云)中,在其中保存它以便能够使用CFM API将将来的推送通知从服务器发送到设备。 //public class CFMInstanceIDService extends FirebaseInstanceIdService ... public void onTokenRefresh() { ... String cfmToken = FirebaseInstanceId.getInstance().getToken(); ... sendRegistrationToServer(customerGuid, cfmToken); } 通过这样做,我在服务器上拥有了一个所有已登录客户的(多个)设备的列表。 (平板电脑,手机,iPhone,Android等) 有什么方法可以随时验证/验证令牌吗? 我想知道/确保与客户关联的所有令牌都属于真实设备。 我不想将推送通知发送到不存在的令牌。 回答1 这是一个curl请求示例,该示例显示了如何在无需实际发送消息的情况下验证令牌: curl -H "Content-Type: application/json" -H "Authorization: key=$FCM_API
  • Firebase 3:使用.net和C#创建自定义身份验证令牌(Firebase 3: creating a custom authentication token using .net and c#)
    问题 我正在尝试使用自定义令牌来实现Firebase 3身份验证机制(如https://firebase.google.com/docs/auth/server/create-custom-tokens中所述)。 我的服务器是ASP.NET MVC应用程序。 因此,根据说明(https://firebase.google.com/docs/server/setup),我为Firebase应用程序创建了一个服务帐户,并生成了“ .p12”格式的密钥。 之后,根据此处的说明(https://firebase.google.com/docs/auth/server/create-custom-tokens#create_custom_tokens_using_a_third-party_jwt_library),我尝试生成自定义令牌并使用上一个收到的密钥对其进行签名步。 为了生成令牌,我使用了Microsoft的SystemIdentityModel.Tokens.Jwt库,因此代码如下所示: var now = DateTime.UtcNow; var tokenHandler = new JwtSecurityTokenHandler(); var key = new X509AsymmetricSecurityKey(new X509Certificate2(p12path
  • 使用邮件和密码通过REST API进行身份验证[Firebase](Using mail and password to authenticate via the REST API [Firebase])
    问题 我想知道是否可以不使用自定义身份验证对Firebase REST API进行身份验证? 我已经在Firebase上工作了一段时间,目前正在考虑将自己的后端迁移到Firebase。 当前使用后端的应用程序使用REST API,根本不需要实时数据。 因此,我只想在客户端上使用REST API,而不使用完整的Android框架。 是否可以通过HTTP请求使用Firebase的邮件和密码身份验证来获取身份验证令牌? 在旧文档中,我仅找到了具有自定义登录名的解决方案,而在新文档中,您似乎需要一个Google服务帐户。 任何帮助或建议表示赞赏。 回答1 更新:Firebase REST身份验证现已记录! 查看文件 Firebase REST身份验证 我通过检查Javascript API发送的请求,了解了如何为Firebase执行电子邮件和密码身份验证。 这些API未记录且不受支持 火力基地3 Firebase 3身份验证是Google身份工具包的更新和重命名的版本。 旧的文档并不完全准确,但是可能很有用,可以在以下位置找到:https://developers.google.com/identity/toolkit/web/reference/ Firebase 3要求所有请求的标头均具有Content-Type: application/json API密钥 Firebase
  • 使用firebase简单登录时如何访问/验证firebase auth对象的内容?(How to access/verify the contents of the firebase auth object when using firebase simple login?)
    问题 使用 firebase 简单登录时是否可以访问/验证 firebase auth 对象的内容? 这对于调试/配置安全规则很有用。 回答1 用于身份验证的额外调试。 使用 Firebase 简单登录时的令牌和安全规则,您可以使用两个很棒的工具: 通过在生成自定义 Firebase 令牌时传递可选的debug: true标志来启用debug模式。 由于安全限制,您在使用委托身份验证服务时无法自动执行此操作,但您可以通过自定义登录自己生成令牌。 此外,尝试使用以下命令在客户端库上启用调试模式,这将产生额外的信息,例如正在读取或写入的路径,以及通过线路传输的数据: `Firebase.enableLogging(true, true);` `authClient.login('twitter', { debug: true });` 正如您所建议的,请查看身份验证令牌的内容。 有几种方法可以做到这一点。 最简单的方法是将其手动传递给firebaseRef.auth() ,并检查回调中返回的响应负载,其中包含身份验证的内容。 令牌。 或者,由于所有 Firebase 身份验证。 令牌遵循开放的 JSON Web Token (JWT) 标准,可以解析 auth 的内容。 通过 Base64 解码每个标记序列的标记,由句点 ( . ) 分隔。 通常,Firebase
  • FCM 安全:防止多个发件人向所有设备推送通知?(FCM Security: Prevent multiple senders from pushing notifications to all devices?)
    问题 作为我们解决方案的一部分,我们希望在我们的每个客户站点部署一个 FCM“应用服务器”。 每个客户站点都有自己的用户,他们使用我们的应用程序使用自己的设备。 但是,我们希望确保如果客户站点之一遭到破坏,攻击者无法滥用 FCM“应用服务器”(例如,通过向所有客户站点的所有设备发送通知)。 我们没有在所有客户站点之间共享凭据,而是考虑为每个客户站点生成唯一的服务器密钥。 这样,如果一个客户站点遭到入侵,我们可以禁用该服务器密钥并停止发送任何更多 FCM 通知。 问题:我们可以确定攻击者不能向所有设备发送全局通知吗? 假设攻击者拥有服务器密钥并可以访问一个客户站点“app-server”,他们能否获得所有已注册设备的列表? 是否有发送到所有设备的默认通知“主题”? (例如/topic/all 或/topic/global)。 如果是这样,我们可以禁用该默认主题吗? 回答1 我们没有在所有客户站点之间共享凭据,而是考虑为每个客户站点生成唯一的服务器密钥。 这样,如果一个客户站点遭到入侵,我们可以禁用该服务器密钥并停止发送任何更多 FCM 通知。 如果“我们正在考虑为每个客户站点生成一个唯一的服务器密钥”,您的意思是您只需为每个客户站点创建一个 Firebase 项目,那么我认为这是正确的方法。 我们能确定攻击者不能向所有设备发送全局通知吗? 应用程序可以通过实现getToken
  • Firebase 存储安全规则和 Firestore(Firebase Storage security rules and firestore)
    问题 我在 Firestore 中有“组”。 每个组都有一个“成员”键。 我的目标是编写一个 Firebase 存储安全规则,只允许“写入”组的成员: # I want something like this match /groups/{groupId} { allow read, write: if request.auth.uid in get(/database/groups/{groupId}/members); } 回答1 安全规则无法从其他服务读取,因此您将无法按照您在此处描述的方式实现组。 相反,您必须在您的规则本身或用户的 ID 令牌(作为自定义声明)中编码某人属于哪些组的知识。 在用户的令牌中嵌入组成员身份 有关后者的示例,请参阅 Firebase 文档中有关将数据设为“组私有”的此片段: 另一个同样常见的用例是允许对对象进行组权限,例如允许多个团队成员在共享文档上进行协作。 有几种方法可以做到这一点: 创建一个 Firebase 身份验证自定义令牌,其中包含有关群组成员的其他信息(例如群组 ID) 在文件元数据中包含组信息(例如组 ID 或授权 uid 列表) 一旦此数据存储在令牌或文件元数据中,就可以从规则中引用它: // Allow reads if the group ID in your token matches the file metadata
  • 如何在nodejs的firebase-admin中对用户进行身份验证?(How to authenticate an user in firebase-admin in nodejs?)
    问题 目前我正在 nodejs 上创建一个 Firebase API。 我想在 nodejs 上使用 firebase-admin 处理所有 Firebase 内容(如身份验证)。 但是,在客户端没有Javascript Firebase SDK 的情况下,在 firebase-admin 中通过 nodejs 对用户进行身份验证的正确方法是什么? 在 admin 的官方文档中,我没有找到用于nodejs 的名为signInWithEmailAndPassword的函数(就像在客户端 SDK 上一样)。 只有一个函数叫做:“ getUserByEmail ”,但是这个函数不会检查用户是否输入了正确的密码。 这是我的表格: <form class="sign-box" action="/login" method="post"> <div class="form-group"> <input id="username" name="username" type="text" class="form-control" placeholder="E-Mail"/> </div> <div class="form-group"> <input id="password" name="password" type="password" class="form-control"
  • Firebase custom token authentication (firebase version 3)
    I have an authentication server (NodeJS) where I authenticate a user and create a custom firebase token var token = firebase.auth().createCustomToken(userId); I used to be able to verify a user token (previous version), but now it is not so simple... I would like to get the decoded userId from the token firebase.auth().verifyIdToken(token).then(function).... does not work for server generated custom tokens. Does anyone know how this could be done?
  • Firebase FCM 令牌 - 何时发送到服务器?(Firebase FCM token - When to send to server?)
    问题 好的,所以我有一个应用程序,它首先会带您浏览一些欢迎幻灯片,然后带您进入登录/注册页面,然后进入MainActivity 。 我刚刚实施了FCM ,服务在用户看到任何这些页面之前生成了一个token 。 我怎样才能让服务在我到达MainActivity后运行? 问题是我正在尝试将令牌刷新到MySQL DB发送到适当的用户帐户,但由于用户尚未登录,因此该令牌为null并且我向服务器发送的消息失败。 设计这个的好方法是什么? 我想在SharedPreferences中保存令牌并在用户登录后将其发送到服务器,但是当稍后刷新令牌时会产生很多复杂性?! 可能的解决方案: 我不确定我是否完全理解这 2 个服务是如何运行的,但在onTokenRefresh说我只是将令牌保存到SharedPreferences ,在 MainActivity 中我从SP获取值,然后将其发送到服务器。 在这种情况下,当令牌刷新时,新值将立即再次进入SharedPreferences 。 但是我仍然需要检查它是否是 SP 中的新值,然后将其重新上传到服务器。 这令人困惑! 回答1 是的 FCM 令牌是自动生成的。 但是尝试从不同的角度看待这一点。 我就是这样处理的。 让 FCM 在您的应用程序启动后立即生成令牌。 OnTokenRefresh 将被调用,您只需将其保存在您的首选项中: @Override
  • 在 Firebase Firestore 中,有没有办法将信息传递给不属于路径的安全规则?(In Firebase Firestore, is there any way to pass info to the Security Rules which is not part of the path?)
    问题 我想向 Firestore 数据库 (Firebase) 发送一些信息,最好是键值对(但不一定),以便它可以使用它来评估其规则中的访问(在读取和写入时)。 但是,我不希望此信息成为路径的一部分。 例如,假设我有一些passParameters方法: DocumentReference docRef = db.collection("cities") .document("SF") .passParameters("abc", 123); 然后我可以在编写规则时访问这些信息,如下所示: service cloud.firestore { match /databases/{database}/documents/cities/SF/ { allow read, write: if request.parameters.abc == 123; } } 请注意,以上只是一个例子。 现实生活中的用例更为复杂。 换句话说,不要过多关注示例本身,而是回答更通用的问题:有没有办法将信息传递给不属于路径的安全规则? 回答1 您可以使用自定义令牌发送此类参数。 将这些值作为声明包含在自定义令牌中,并在向 Firestore(或登录)发送请求时在客户端中使用该令牌。 此链接解释了如何 - 1) 创建自定义令牌,2) 在这些令牌中包含自定义声明,以及 3) 在安全规则中访问这些声明。