Android Firebase云消息传递-如何验证令牌?

Android Firebase云消息传递-如何验证令牌?,android,firebase,firebase-cloud-messaging,Android,Firebase,Firebase Cloud Messaging,我正在使用Firebase云消息(FCM),根据下面的删节代码,每次在客户设备上生成新令牌时。。。我将这个新令牌发送到我的服务器DB(云),并保存它,以便能够使用CFM API从服务器向设备发送未来的推送通知 //public class CFMInstanceIDService extends FirebaseInstanceIdService ... public void onTokenRefresh() { ... String cfmT

我正在使用Firebase云消息(FCM),根据下面的删节代码,每次在客户设备上生成新令牌时。。。我将这个新令牌发送到我的服务器DB(云),并保存它,以便能够使用CFM API从服务器向设备发送未来的推送通知

    //public class CFMInstanceIDService extends FirebaseInstanceIdService ...

    public void onTokenRefresh() {
        ...
        String cfmToken = FirebaseInstanceId.getInstance().getToken();        
        ...     
        sendRegistrationToServer(customerGuid, cfmToken);
    }
通过这样做,我在服务器上有一个客户登录的所有(多个)设备的列表。(平板电脑、手机、iPhone、Android等)

是否有任何方法可以随时验证/验证令牌?


我想知道/确保我与客户关联的所有令牌都属于真实设备。我不想向不存在的令牌发送推送通知。

不存在这样的东西,您可以从令牌获得的唯一信息是应用程序信息,而不是它是否有效

您应该做的是在发送push's out时观察响应,如果按键不再有效,响应将告诉您哪些按键应该使用
NotRegistered


在发送下游消息之前,无法验证令牌是否仍然有效。您需要做的是在发送消息后检查响应,然后检查响应是否包含任何错误

例如,如果服务器返回
200+错误:NotRegistered
http代码,则表示现有注册令牌可能不再有效


在“”一节中,您将发现记录的每个可能的状态响应

下面是一个示例curl请求,它演示了如何在不发送消息的情况下验证令牌:

curl -H "Content-Type: application/json" -H "Authorization: key=$FCM_API_KEY" https://fcm.googleapis.com/fcm/send -d '{"registration_ids":["$FCMTOKEN"]}'
无效响应示例:

{"multicast_id":7452350602151058088,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]}
{"multicast_id":9133870199216310277,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1502817580237626%f590ddc2f9fd7ecd"}]}
有效响应示例:

{"multicast_id":7452350602151058088,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]}
{"multicast_id":9133870199216310277,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1502817580237626%f590ddc2f9fd7ecd"}]}

我从谷歌的firebase支持团队那里得到了这个答案。

实际上有一个解决办法,你可以使用
dry\u run=true

此参数设置为true时,允许开发人员在不实际发送消息的情况下测试请求


如果用户取消订阅,您的响应为
未注册
,但不会执行真正的发送

您可以通过调用

(GET) https://iid.googleapis.com/iid/info/YOUR_APP_TOKEN_HERE
[Header] => 'Authorization: key=YOUR_KEY'
简单易用


如果令牌有效,则返回200个状态代码,其中包含JSON格式的更多详细信息;如果令牌无效,则返回400个状态代码,其中包含JSON格式的错误详细信息。

使用实例id端点时,您可以检查令牌的信息,响应将指示(不是特别地)令牌无效,可能是因为没有令牌的信息,或者令牌的格式无效;至少对我的iOS设备是这样。包括“dry_run”:请求中的true表示未发送任何消息在失败情况下如何获取注册令牌id?现在,我们只能收到诸如错误和消息_id之类的响应。但我也需要注册令牌id。请尽快响应。@sameer您将在响应中获得结果信息(数组字典)。数组响应中的每个字典项表示批量请求中每个设备令牌的状态(与您发送的顺序相同)。如果任何字典将错误保留为“NotRegistered”,您可以通过匹配索引来获取相应的令牌并将其从数据库中删除。使用curl:
curl-H“Content-Type:application/json”-H“Authorization:key=$FCM\u API\u key”https://fcm.googleapis.com/fcm/send -d'{“注册ID”:[“$FCMTOKEN”],“dry_run”:true}“
reference:如果您的应用程序令牌是FCM令牌,从何处检索您的密钥?@StefanZivkovic-这是用户的jwt令牌