当前位置: 首页 > 知识库问答 >
问题:

GCM令牌何时到期?InstanceID是多少?

祁英哲
2023-03-14

由于GCM不断更新,我搜索的大多数资源似乎都过时或不清楚。基本上,我对代币和ID的到期时间感到困惑。(作为参考,我正在使用Android。)

据我所知(如果我错了,请纠正我),我的服务器有一个API密钥和一个发件人ID。使用发件人ID,我可以让我的客户端通过本地存储在我的客户端上的InstanceID请求令牌。我已经有点困惑了。InstanceID在我的应用上线时被分配?它会改变吗?当应用程序升级或卸载并重新安装(或设备恢复)时怎么办?通过调用InstanceID. getInstance,我将始终检索相同的InstanceID,还是它最终会过期并给我一个新的?存储通过调用getID()检索的字符串是否有任何价值?文档似乎表明,当您调用getID()时,您实际上检索了一个新的InstanceID,因此这使事情更加复杂。(作为参考,我指的是:https://developers.google.com/instance-id/)

使用InstanceID,我的客户端可以从GCM服务器请求令牌,然后将令牌发送到我的应用服务器。My app server存储此令牌,并可以使用此令牌向GCM服务器发送消息,然后GCM服务器将消息发送到设备。我相信,该设备使用存储的InstanceID来实际接收这些消息。因此,拥有一个扩展GcmListenerService的类将允许我使用onMessageReceived接收这些消息?我不需要做任何特殊的事情(除了在AndroidManifest中定义它)?我不需要告诉它使用InstanceID?它只是神奇地知道?

这些ID和令牌何时到期?它们过期了吗?我将令牌作为字符串存储在服务器上,但是如果在任何时候其中一个过期,我如何知道它们已过期?我总是可以生成一个新的InstanceID和令牌,这看起来很简单,但是旧的InstanceID和令牌是否保持活动状态?如何从服务器擦除旧令牌?似乎有一种简单的方法可以在iOS端的APN上实现这一点,您可以检索所有过期令牌的列表,然后将它们从数据库中删除。

共有3个答案

伏星汉
2023-03-14

实例ID为应用程序的每个实例提供唯一的ID。您可以为Android和iOS应用以及Chrome应用/扩展实现实例ID。

除了提供用于身份验证的唯一ID之外,实例ID还可以生成用于其他服务的安全令牌。

  • 生成安全令牌
  1. 当您的应用程序联机时,Instance ID服务会发出InstanceID。InstanceID由一对公钥/私钥支持,私钥存储在本地设备上,公钥在InstanceID服务中注册
  2. 您的应用程序可以在需要时使用getID()方法请求一个新的InstanceID。如果您有支持您的应用的服务器,您的应用可以将其存储在服务器上
  3. 您的应用程序可以根据需要使用getToken()方法从实例ID服务请求令牌,并且与InstanceID一样,您的应用程序也可以在您自己的服务器上存储令牌。向应用程序颁发的所有令牌都属于应用程序的InstanceID
  4. 令牌是唯一且安全的,但如果出现安全问题,或者在设备恢复期间用户卸载并重新安装应用时,您的应用或实例ID服务可能需要刷新令牌。您的应用程序必须实现侦听器,以响应来自实例ID服务的令牌刷新请求
  • 应用删除实例ID
  • 设备出厂复位
  • 用户卸载应用
  • 用户清除应用数据

如果实例ID无效,应用程序可以调用getId()来请求新的实例ID。要证明实例ID的所有权并允许服务器访问与应用程序关联的数据或服务,请调用getToken(String,String)。

实例ID服务定期(例如,每6个月)发起回调,请求应用刷新其令牌。它还可以在以下情况下启动回调:

存在安全问题;例如,SSL或平台问题。设备信息不再有效;例如,备份和还原。实例ID服务会受到其他影响。

有关实例ID的所有信息,请参见以下官方链接:

  • https://developers.google.com/instance-id/
  • https://developers.google.com/android/reference/com/google/android/gms/iid/InstanceID
  • https://developers.google.com/instance-id/guides/android-implementation#refresh_tokens
尹弘壮
2023-03-14

下面是我在数据库中检测无效令牌所做的工作。

向用户/用户列表发送通知时,GCM中有一个干运行选项。当您在发送通知时设置干运行时,它不会向客户端发出警报或向客户端显示通知,而是返回关于哪些令牌有效(200)和哪些令牌无效的响应。

如果您使用“使用干运行”选项向200个用户发送通知,那么您将以相同的顺序从GCM获得响应。

都飞跃
2023-03-14

当我更新我的GCM实现时,我发现我自己也在问这些问题。经过几天的胡闹,下面是我对你们问题的看法。

据我所知(如果我错了,请纠正我),我的服务器有一个API密钥和一个发送者ID。使用发送者ID,我可以让我的客户端通过本地存储在客户端上的InstanceID请求令牌。

这是正确的。

InstanceID是在我的应用程序联机时分配的吗?

它看起来像是在你的应用程序启动时就分配的,即使设备无法访问互联网。

它会改变吗?当应用程序升级或卸载并重新安装(或设备恢复)时怎么办?通过调用InstanceID. getInstance,我将始终检索相同的InstanceID,还是它最终会过期并给我一个新的?

根据InstanceID留档:

实例ID是稳定的,但可能会变得无效,如果:

  • 应用程序删除实例ID
  • 设备出厂复位
  • 用户卸载应用程序
  • 用户清除应用程序数据

如果实例ID无效,应用程序可以调用getId()来请求新的实例ID。

我已经测试过卸载应用程序并清除数据,结果表明上述所有内容都是正确的。

通过调用getID()来存储检索的字符串是否有任何价值?

看起来API处理将此存储在应用的本地存储中。

使用InstanceID,我的客户端可以从GCM服务器请求令牌,然后将令牌发送到我的应用服务器。My app server存储此令牌,并可以使用此令牌向GCM服务器发送消息,然后GCM服务器将消息发送到设备。我相信,该设备使用存储的InstanceID来实际接收这些消息。因此,拥有一个扩展GcmListenerService的类将允许我使用onMessageReceived接收这些消息?我不需要做任何特殊的事情(除了在AndroidManifest中定义它)?我不需要告诉它使用InstanceID?它只是神奇地知道?

据我所知,在以前的实现中没有任何类型的InstanceId,而且看起来在这个实现中也没有显式使用它。如果是,则在GcmReceiver或GcmListenerService中调用。

这些ID和令牌何时到期?它们过期了吗?

我已经解决了ID过期的问题,我们可以在Android InstanceID实施指南中找到关于令牌过期的信息:

实例ID服务定期(例如,每6个月)发起回调,请求应用刷新其令牌。它还可以在以下情况下启动回调:

  • 存在安全问题;例如,SSL或平台问题。
  • 设备信息不再有效;例如,备份和恢复。
  • 实例ID服务会受到其他影响。

指南要求子类InstanceIDListenerService并重写onTokenRefresh(),以处理这些场景。

我将令牌作为字符串存储在服务器上,但是如果在任何时候其中一个过期,我如何知道它们已过期?

在您的服务器上实现GCM的指南说,GCM服务器将响应您的服务器,提供一些关于您用于尝试发送消息推送的令牌的信息。

我总是可以生成一个新的InstanceID和Token,这看起来很容易,但是旧的会保持活跃吗?

我的测试表明,是的,他们有。

如何从服务器擦除旧令牌?似乎有一种简单的方法可以在iOS端的APN上实现这一点,您可以检索所有过期令牌的列表,然后将它们从数据库中删除。

我仍在研究这个问题,如果我能想出办法,我会更新的。

 类似资料:
  • 我对android Gcm令牌过期策略很好奇。当我希望向Gcm服务注册的设备能够接收Gcm推送消息时,我将向API注册它。 然后我会得到一个Gcm令牌“a”。如果我从未在play store上升级我的应用程序版本代码。谷歌会用“B”刷新它并自动终止“A”吗? 如果是,它什么时候做。我看过一些文章说,一旦“A”被“B”刷新,那么当服务器试图向“A”发送消息时,服务器将获得新的注册标识“B”。我现在想

  • 我在谷歌CloudMessaging的GCM注册。getInstance(上下文);并将收到的令牌保存在设备上。然后将其发送到服务器,并将其与用户帐户关联。如果我卸载我的应用程序而不注销,然后再次安装并与其他用户登录,我将收到新令牌并将其发送到服务器。当推送被发送给第一个用户时,我会在和第二个用户登录时看到它们。 为什么GCM给我发送不同的令牌,我如何处理?

  • 下面是官方指南中的GCM Android集成示例。 特别是,我对上述链接类中的以下行感到困惑: 现在,每当我的主要活动启动时,我都会调用intent服务,我相信instanceID负责启动令牌刷新。 我是否应该在每次从我的主要活动启动此GCM注册意图时检查Shared Prefs值。但是,在这种情况下刷新将失败,因为在初始令牌获取之后,条件将始终为true。 我应该放弃共享prefs逻辑吗?这样每

  • 我已经阅读了跑道文档。我特别考虑了以下关于使用的声明: 此请求返回与上述相同的数据,您可以继续反复执行此操作,以保持应用程序的身份验证,而无需要求用户重新身份验证。 这是否意味着将无限期有效或过期: < li >签发后X天;或者 < li >最后一次使用它获取新的< code>access_token后的X天 编辑:请参阅此跑道线程,该线程提出相同的问题,但似乎没有给出任何关于Oauth2.0协议

  • 当我从Google API获得一个< code>access_token时,它带有一个< code>expires_in值。根据文档,该值表示“访问令牌的剩余寿命”。 这个值的单位是多少?

  • 我在Youtube developers网站上阅读了文档,它没有谈到任何有效性。 OAuth2.0标准是否定义了任何有效期,或者授权令牌在用户手动撤销之前是否有效? OAuth规范定义了令牌在授予后不久将到期,那么它会在我获得访问和刷新令牌后到期吗?我是否可以将此访问令牌用于所有未来的API请求,或者我是否需要定期获得一个新令牌?