Azure 通知中心 - “从令牌提供程序获取的令牌错误”

Posted

技术标签:

【中文标题】Azure 通知中心 - “从令牌提供程序获取的令牌错误”【英文标题】:Azure Notification Hub - "The token obtained from the token provider is wrong" 【发布时间】:2019-05-30 10:10:07 【问题描述】:

使用 Notifications REST API 和 javascript,我们通过 FCM 订阅我们的 Progressive Web App,然后调用registrations 端点在我们的 ANH 上注册

注册完成正常,我们可以在我们的集线器上使用正确的平台和填充的 PNS 标识符看到注册

当我们尝试向所有注册设备发送测试消息时,我们在 ANH 中收到以下错误

从令牌提供者获取的令牌错误

我们已尝试发送 Firebase 返回的整个 endpoint 对象,仅发送 subscriptionId 和其他各种组合

错误信息是否意味着我们使用了错误的密钥对进行了订阅,或者令牌的格式不正确?在注册端点注册时,没有任何地方显示GcmRegistrationId 格式的示例

【问题讨论】:

您是否尝试过查看这些类似的主题? 39694294, 37011339 【参考方案1】:

您可以使用以下方法注册您的设备:

如果是 GCM,请遵循以下方法:

将 Nuget 包用于通知中心。

对于 DeviceRegistration.cs

 public class DeviceRegistration
    
        public string Platform  get; set;  
        public string Handle  get; set; 
        public string[] Tags  get; set; 
    

对于 NotificationClient.cs

 using Microsoft.Azure.NotificationHubs; // Namespace to be used

// Use below method to get registrationID

 public async Task<string> GetRegistrationID(NotificationHubClient Hub, string handle = null)
        
            string newRegistrationId = null;

            // make sure there are no existing registrations for this push handle (used for ios and android)
            if (handle != null)
            
                var registrations = await Hub.GetRegistrationsByChannelAsync(handle, 100);
                foreach (RegistrationDescription registration in registrations)
                
                    if (newRegistrationId == null)
                    
                        newRegistrationId = registration.RegistrationId;
                    
                    else
                    
                        await Hub.DeleteRegistrationAsync(registration);
                    
                
            

            if (newRegistrationId == null)
                newRegistrationId = await Hub.CreateRegistrationIdAsync();

            return newRegistrationId;
        

// Use below method to upsert registration to azure

 public async Task UpsertRegistration(string registrationid, DeviceRegistration deviceUpdate, NotificationHubClient Hub)
            
    string[] tags =  "abc","def" ; // These are used to send notifications
     DeviceRegistration deviceRegistration = new DeviceRegistration
                    
                        Handle = newDeviceToken, // Device token given by Firebase
                        Platform = "gcm", // Specify gcm for android and "apns" for ios  
                        Tags = tags
                    ;

                RegistrationDescription registration
                         = new GcmRegistrationDescription(deviceRegistration.Handle);



                registration.RegistrationId = registrationid;

                // add check if user is allowed to add these tags
                registration.Tags = new HashSet<string>();
                foreach (string tag in deviceUpdate.Tags)
                
                    registration.Tags.Add(tag);
                

               await Hub.CreateOrUpdateRegistrationAsync(registration);           
            

【讨论】:

我们仍然收到错误,我们没有使用 Nuget 包,我们使用的是 JavaScript。运行代码后,GcmRegistrationId 的格式是什么? (registration.RegistrationId RegistrationId 是从 Azure 通知中心获得的。我在回答中提到了该方法。注册 ID 示例为“7879195269520841161-4412273044718808258-3” 我不是在谈论 Azure 返回的 registrationId - 我已经有了。当我们尝试发送消息时,Azure 告诉我们令牌(PNS 句柄)不正确,所以我想知道在调用注册 REST API 端点时我应该发送到 Azure 的 PNS 句柄(GcmRegistrationId)的格式是什么 PNS 句柄和 GCMRegistrationID 不同。 PNS句柄实际上是凭证,从“谷歌火力”这就好比“eIiZYb98yG8:APA91bFmRozDiXoPkQolbnsFnpGaeRp8TUi_7kcOl2s0W-GavRJW07XDaUPNJlZOScWVsUwLRvxg2fbow45QIE1Pf4-HKBet_vCbdW7zvofkATkDRYrPRcP0AMOd6m2wl7uo1J5WgLD1”接收移动设备。从 Firebase 获得此信息后,您可以调用 azure hub 为您提供我提到的方法的registrationID。获得两者后,您通过上述方法将您的 PNS 句柄和registrationID 注册到集线器为“UpsertRegistration” @Mike 您在这方面需要任何进一步的帮助吗?

以上是关于Azure 通知中心 - “从令牌提供程序获取的令牌错误”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Azure 通知中心?

Azure 通知中心的 Xamarin.Forms PushNotifications

Azure 通知中心不会发送苹果推送通知

Azure 通知中心 [关闭]

azure-android 通知中心有效文档

传递到 Azure 通知中心的通知消息未到达设备 (Android)