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

56

我正在使用Firebase Cloud Messaging (FCM),根据下面缩写的代码,每当在客户设备上生成新令牌时...... 我会将此新TOKEN发送到我的服务器数据库(Cloud)中保存,以便能够使用CFM API从服务器向设备发送未来的推送通知

    //public class CFMInstanceIDService extends FirebaseInstanceIdService ...

    public void onTokenRefresh() {
        ...
        String cfmToken = FirebaseInstanceId.getInstance().getToken();        
        ...     
        sendRegistrationToServer(customerGuid, cfmToken);
    }

通过这样做,我在服务器上有一个客户登录的所有(多个)设备列表。(平板电脑、手机、iPhone、Android等)

有没有办法随时验证/验证令牌?

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

6个回答

47

以下是一个示例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"}]}

我从谷歌 Firebase 支持团队得到了这个答案。


7
实际发布的答案确实会发送消息;至少对我的iOS设备是这样。在请求中包含 "dry_run": true 意味着不会发送任何消息。 - Dave Nottage
2
如何在失败情况下获取注册令牌ID?现在,我们只能收到错误和消息ID等响应。但我也需要注册令牌ID。请尽快回复。 - sameer
3
@sameer,你将在响应中获得结果信息(数组的字典)。响应中数组响应内的每个字典项表示批量请求中每个设备令牌的状态(与您发送的顺序相同)。如果任何一个字典包含错误“NotRegistered”,则可以通过匹配索引获取相应的令牌并从数据库中删除它。 - Shamsudheen TK
从哪里可以获取 $FCM_API_KEY? - Mudaser Ali
https://dev59.com/qVgR5IYBdhLWcg3wO7XX#57297765 解决了我的问题。 - Mudaser Ali

25

实际上有一种解决方法,你可以使用 dry_run = true

当这个参数设置为true时,允许开发者在不实际发送消息的情况下测试请求。

Firebase文档

如果用户取消订阅,则会收到一个包含NotRegistered的响应,但实际上不会执行真正的发送。


10
дҪҝз”Ёcurlе‘Ҫд»ӨеҸ‘йҖҒFCMжҺЁйҖҒпјҡcurl -H "Content-Type: application/json" -H "Authorization: key=$FCM_API_KEY" https://fcm.googleapis.com/fcm/send -d '{"registration_ids":["$FCMTOKEN"], "dry_run": true}'гҖӮе…¶дёӯпјҢ$FCM_API_KEYе’Ң$FCMTOKENйңҖиҰҒжӣҝжҚўдёәе®һйҷ…зҡ„еҖјгҖӮ - Pabi

19

您可以通过调用以下方法验证 FCM 令牌:

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

简单易懂。

如果令牌有效,则会以JSON格式返回一些详细信息并返回状态码200,如果无效则状态码为400并在JSON格式中返回错误详细信息。


请返回仅翻译的文本:参考:https://developers.google.com/instance-id/reference/server - Gowtham
3
如果YOUR_APP_TOKEN_HERE是FCM令牌,则从哪里获取YOUR_KEY? - Stefan
@StefanZivkovic - 这是用户的 JWT 令牌。 - Gowtham

9

1
当使用instance-id端点时,您可以检查令牌的信息,响应会指示(不是特别明确)该令牌无效,可能是因为没有该令牌的信息或者令牌格式无效。 - Arthur Thompson

2

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

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

在"FGC的下行消息错误响应代码"部分,您将找到记录的每个可能的状态响应。


0

如果您有adminsdk凭据,您可以使用以下代码:

func TestPushToken(t *testing.T) {
    ctx := context.Background()

    opt := option.WithCredentialsJSON([]byte(credential))
    app, err := firebase.NewApp(ctx, nil, opt)
    if err != nil {
        t.Error(err)
    }

    msg := &messaging.Message{
        Notification: &messaging.Notification{
            Title: "Hi",
            Body:  fmt.Sprintf("Welcome at %d", time.Now().Unix()),
        },
        Token: pushToken,
    }

    fcmClient, err := app.Messaging(ctx)
    run, err := fcmClient.SendDryRun(ctx, msg)
    if err != nil {
        t.Error(err)
    }
    fmt.Println(run)
}

如果出现任何错误,那意味着 pushToken 是无效的。否则您将会得到以下响应。
/messages/fake_message_id

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接