问题标签 [server-to-server]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
788 浏览

ios - 使用服务器到服务器通知和 Firebase Cloud Functions 对 iOS 和 Android 自动更新订阅进行服务器端验证

我已经成功地为 Google Play 实施了订阅验证,但我很难理解 iOS 自动更新订阅的验证流程,并且想寻求您的帮助。以下是 Google Play 的高级逻辑:

新订阅验证

  1. 用户在应用程序中购买订阅。
  2. 在我的 Firestore 数据库中创建了一个SubscriptionRequest ,其中包括用户 ID和交易令牌
  3. 云函数获取该SubscriptionRequest并使用令牌查询相关的 Google API以获取订阅详细信息。这是使用googleapis Node.js 库完成的。
  4. 最新的订阅详细信息作为Subscription保存在 Firestore 中,包括令牌(作为linkedPurchaseToken)和UserID
  5. 评估订阅的到期日期,如果未到期,则更新 Firebase 中的用户并相应设置标志hasActiveSubscription(包括订阅的 Google Play 标识符,例如, monthly_subyearly_sub和平台,在此案例安卓)。

Google Play 开发者通知

  1. 通过 Pub/Sub 云功能接收通知。
  2. 将使用相关的 Google API 和通知中的令牌获取相应的订阅详细信息。
  3. 如果数据库中不存在具有该令牌的订阅(如linkedPurchaseToken),我们将尝试使用从 (2) 中获取的订阅详细信息中的linkedPurchaseToken在我们的数据库中查找现有订阅。
  4. 如果在数据库中仍然找不到订阅,这显然意味着它是一个新订阅,它将通过上述新订阅验证过程专门处理。这样做的原因是我无法将我的UserID和订阅链接起来。
  5. 如果找到订阅,则会使用最新的详细信息对其进行更新。
  6. 评估订阅的到期日期,如果未到期,则更新 Firebase 中的用户并相应地设置标志hasActiveSubscription。[...]

这在相当长的一段时间内一直运行得非常好和强大。

据我所见,可用于传递的developerPayload ,例如UserID,以确定订阅属于谁,已被弃用。(来源

您是否认为有更简单的方法可以做到这一点,可能 使用 Google Play 开发者通知?

我在订阅更改的每一步都收到通知,我只是根据到期日期更新我的订阅hasActiveSubscription标志。这很好用,因为我在订阅到期时收到通知(通知类型SUBSCRIPTION_EXPIRED),并且在任何时候订阅都会延长,例如。(来源

该验证逻辑中是否缺少任何内容或任何潜在风险?

到目前为止,这两个问题只是为了确保我没有遗漏一些重要的东西。同样,根据我的经验,这工作得很好。

在 iOS 上发布我的应用程序(顺便说一下,基于 Flutter)剩下的就是实现 iOS 的验证逻辑。

使 google 验证逻辑变得相当简单的一件事是googleapis库,它本质上为我提供了所有响应的模型类,例如通知或订阅详细信息。我一直无法为 Apple 找到类似的东西,我不确定是否有。

是否有任何(官方)库为我提供与Node.js的googleapis类似的功能?

对于新订阅,我目前正在查询verifyReceipt端点,该端点似乎运行良好。但是,Apple 似乎没有在任何地方说明需要准确验证哪些字段,以便为用户提供应用程序内的访问权限。我遵循相同的逻辑,意思是:如果我确实收到了来自端点的有效收据并且没有过期,我会授予访问权限。

这种逻辑对于新订阅是否足够,或者我错过了什么?

到目前为止,对于 Google,我只是存储了通过查询 api 收到的订阅详细信息,包括UserIDtoken。这样做主要是为了懒惰,因为收到的文档结构相当简单。苹果的反应要复杂得多,所以我很不确定要存储什么(如果你问我,文件记录很差),所以我想知道:

对于 Google 和 Apple,我实际上需要哪些详细信息,尤其是在我依赖通知更新订阅的情况下?

关于订阅的更新,我想知道如何使用来自 Apple 的服务器到服务器通知。

它们究竟是什么时候发送的,我可以实现与上述 Android 相同的逻辑吗?

因为我似乎找不到这部分的好文档或教程:

您可能知道这些通知的任何好的教程吗?

非常感谢您的支持,马蒂亚斯

0 投票
3 回答
480 浏览

webhooks - 什么是 Apple 服务器到服务器通知的重试策略

我正在实现管理 IOS 应用程序订阅的服务器端应用程序。要在后端控制帐户状态(订阅是否处于活动状态),我正在使用Apple Server-to-Server Notifications

文档说:

响应服务器到服务器的通知您的服务器应该发送一个 HTTP 状态代码来指示服务器到服务器的通知发布是否成功:

如果发布成功,则发送 HTTP 200。您的服务器不需要返回数据值。

如果发布不成功,发送 HTTP 50x 或 40x 让 App Store 重试通知。App Store 在一段时间内多次尝试重试通知,但在连续尝试失败后最终停止。

但是,如果我这边出现服务器错误,目前尚不清楚苹果会遵循哪个重试策略。我正在寻找以下问题的答案

  1. 苹果会重试多少次?
  2. 重试之间的间隔是多少?
0 投票
2 回答
451 浏览

django - 没有收到应用内购买服务器到服务器的通知?

我实现了应用内购买服务器到服务器通知并在应用商店中添加 url 但有时我在沙盒环境中没有得到苹果服务器的响应。我的后端是 Python - django。谁能帮我如何实施?

0 投票
1 回答
744 浏览

google-cloud-platform - 谷歌函数 HTTP 触发器 - 身份验证问题服务器到具有服务帐户的服务器

我想要做什么:从我的服务器/机器调用谷歌函数并通过(简单)身份验证限制它的使用。

我使用的是:Node.js,用于身份验证的 google-auth-library库。

我做了什么/尝试了什么

1) 在 Google Cloud Functions 中创建了一个项目

2)创建了一个简单的谷歌函数

3)设置我的自定义服务帐户

4) 启用的 API: - Cloud Functions API - IAM 服务帐户凭据 API - Cloud Run API - 计算引擎 API - IAM 服务帐户凭据 API

5) 授予我的服务器帐户必要的授权(项目所有者、云功能管理员、IAM 项目管理员...... (需要更多?)

6) 从我的服务帐户生成密钥并以 json 格式保存

注意:拥有 allUser 权限(无需授权),我可以毫无问题地调用我的端点

7)从我的项目中,我尝试以这种方式验证我的功能

ℹ️ 如果我尝试在没有函数名称的情况下传递 client.request() url ( https://europe-west1-myFunction.cloudfunctions.net ),我没有收到错误,但是当使用在 fetch 调用中获得的 JWT 令牌时,我收到同样的错误。

结果

❓ 如何调用具有任何保护功能的 google 功能以防止任何人使用它?(我不需要特定的安全性,只是随机用户不使用它)提前感谢您的帮助

0 投票
3 回答
1022 浏览

docker - 如果外部无法直接访问api,为什么内部服务之间的通信需要像oauth这样的授权?

这只是一个关于微服务架构的一般问题。如果外部世界无法访问它们,为什么 2 个或更多内部服务仍然需要像 oauth2 这样的令牌身份验证才能相互通信?他们的 api 不能只过滤内部 IP 地址吗?这种方法有什么风险?

0 投票
1 回答
104 浏览

cloudkit - Node JS 上的 CloudKit 服务器到服务器身份验证出现 401 错误

我正在尝试使用服务器到服务器身份验证查询我的公共 CloudKit 数据库。我已经根据 Apple 的文档生成了密钥,但无论我做什么,我都会收到此错误:

据我所知,我已经按照文档设置了所有内容,但显然我做错了。到目前为止,这是我的 Node 应用程序中的内容:

我已经查看了这篇有用的 SO 帖子,但我仍然卡住了。

谁能看到我可能做错了什么?

0 投票
0 回答
85 浏览

rest - GraphQL 用于读取,Rest 用于写入

服务器到服务器通信的上下文中,更准确地说是在不同的微服务中,使用 GraphQL 是一个好主意吗?

这个想法是允许消费者只为他们获取相关字段。可以自己为 REST GET 端点构建字段投影,也可以使用库来这样做,例如Rest.li

在存在 GraphQL 来解决类似问题的时代,使用 GraphQL 进行 READ (这是 GraphQL 带来很多价值的地方)并仍然使用 REST 进行写操作是否更有意义(有一些令人信服的原因,可以迁移到 GraphQL目前无法进行写入)?

0 投票
1 回答
138 浏览

ios - 具有多个触发器的 Apple 服务器到服务器通知

苹果表示,对于某些订阅事件,它们会触发多个通知。假设我想知道用户是否取消了他们的订阅,以便我可以为他们提供另一个更便宜的选择。

我可以听听以DID_CHANGE_RENEWAL_STATUS确定他们何时关闭自动续订。但是,有一个问题——如果用户升级到另一个 SKU,则会触发相同的通知。事实上,根据他们的文档,它会触发三个通知:CANCELDID_CHANGE_RENEWAL_STATUSINTERACTIVE_RENEWAL

我想区分这些场景。显然,由于这些是异步操作,因此无法保证到达的顺序。但是,我想知道我是否可以期望所有三个通知都会以相同的方式到达unified_receipt?如果是这样,我可以收听DID_CHANGE_RENEWAL_STATUS通知,检查unified_receipt,如果我发现我的用户没有注册另一个产品,我可以为他们提供另一个订阅选项。

但是,文档没有提到 Apple 是否保证在发送多个通知的情况下,所有通知都会以相同的unified_receipt. 这将是合乎逻辑的......但是制作notification_type一个数组来简化事情也是合乎逻辑的。而且,鉴于 Apple 还没有这样做,我担心我们不能期望unified_receipt连续通知是相同的。

有没有人有这方面的经验可以分享一下?

0 投票
1 回答
363 浏览

ios - 向 AppsFlyer 发送服务器到服务器事件

我正在尝试向 AppsFlyer 发送服务器到服务器事件以获取订阅通知。现在我从我的 API 端点捕获了用户订阅数据。根据下面的文章,我必须在 appsflyer 请求中附加“appsflyer_id”和“customer_user_id”。这些 Id 在用户启动应用程序时生成。我怎么知道哪个用户执行了哪个事件?在订阅收据中不包含任何用户的私人数据。如何将“appsflyer_id”和“customer_user_id”与订阅收据映射?

文章: https: //support.appsflyer.com/hc/en-us/articles/360001279189-Subscription-Tracking-Guide#servertoserver

0 投票
1 回答
60 浏览

node.js - 有没有办法识别快速服务器到服务器的请求来源

有没有办法获取远程服务器向我的 api 服务器发出请求的来源信息?目的是防止可能的服务器到服务器身份验证令牌欺骗。

为了进行测试,我基本上从侦听端口8000的测试服务器向服务器发送了远程请求。虽然req.connection.remote.addressapi 服务器记录的记录是一致的,但req.connection.remote.port每次请求都会更改。

有没有办法从 api 服务器的请求对象中获取测试服务器的地址及其端口8000 ?一个开箱即用的解决方案也将受到赞赏。