web-dev-qa-db-fra.com

Obtenir «EndpointDisabled» à partir d'Amazon SNS

J'utilise Amazon SNS. Les notifications fonctionnent bien, mais parfois j'obtiens cette erreur:

{
    "message": "Endpoint is disabled",
    "code": "EndpointDisabled",
    "name": "EndpointDisabled",
    "statusCode": 400,
    "retryable": false
}

Vous savez peut-être pourquoi.

53
user2881338

Vous pouvez créer une nouvelle rubrique SNS telle que Push-notification-failures, puis lui associez l'événement "Delivery Failures" de vos applications APNS/APNS_SANDBOX. Abonnez-vous à l'événement par e-mail (et confirmez) et vous obtiendrez des informations de débogage utiles sur les échecs. Tout cela peut être accompli via la console SNS et ne nécessite pas d'appels API pour effectuer.

Il vaut probablement la peine de souscrire un point de terminaison HTTP à cette rubrique SNS et d'enregistrer tous les échecs de livraison afin de disposer de données historiques à partir desquelles travailler et déboguer les problèmes de production.

Par exemple, une remise FailureMessage de "Le jeton de plate-forme associé au point de terminaison n'est pas valide" signifie que vous envoyez un message d'APNS_SANDBOX à un appareil enregistré APNS ou vice versa. Cela peut signifier que les paramètres APNS sont incorrects pour votre système de génération. (Nous avons un problème frustrant de binaires créés par les développeurs utilisant APNS_SANDBOX par rapport aux binaires créés par TestFlight utilisant APNS pour les tests locaux et le contrôle qualité, ce qui m'a conduit sur cette voie.)

69
cfeduke

J'ai trouvé jusqu'à présent 3 raisons:

  • Parfois, nous mélangions des jetons de l'application sandbox.
  • L'utilisateur désactive les notifications dans les paramètres du téléphone.
  • L'utilisateur a désinstallé l'application.

Il s'agit des Iphons/Ipads.

37
Bartosz Dabrowski

Il y a peu de raisons pour lesquelles un point final peut être désactivé. Je ne l'ai vu documenté nulle part (je l'ai peut-être manqué), voici ce que j'ai obtenu du support:

  • Vous envoyez à un point de terminaison mais le jeton n'est pas valide/a expiré. Les jetons deviennent invalides si:

  • Il appartient à une application qui n'est plus installée sur l'appareil.

  • Si l'appareil a été restauré à partir de la sauvegarde. Cela rend le jeton invalide et votre application doit demander un nouveau jeton et mettre à jour le jeton de point de terminaison SNS en conséquence.

  • L'application a été réinstallée sur le même appareil. Dans le cas d'Android, l'application se voit attribuer un nouveau jeton. Cela se produit également avec les APN mais plus souvent avec Android.

  • Dans le cas des APN, un mauvais profil d'approvisionnement est sélectionné dans xCode. Dans ce cas, les notifications échouent et l'appareil est désactivé plus tard après le retour des APN.

  • Si vous utilisez par erreur un jeton pour IOS développement vers IOS application de production et vice versa).

  • Si Apple pour une raison quelconque, invalide votre IOS Push cert ou quelqu'un révoque le Push cert du portail de connexion iTunes. Cela prend quelques heures avant que l'appareil ne soit désactivé.

  • Même chose avec GCM si vous mettez à jour la clé API à partir de la console de développeur Google sans mettre à jour les informations d'identification de l'application de la plateforme dans SNS.

  • Vous envoyez à un point de terminaison de périphérique APN, mais l'application a été désactivée en raison de l'expiration du certificat Push.

  • Vous poussez vers le point de terminaison de l'appareil GCM, mais la clé API a été mise à jour dans la console des développeurs Google, mais pas les informations d'identification de l'application de la plateforme SNS en conséquence.

Pour plus de détails, je recommande cet excellent article qui résout mon problème

20
Farhan

Selon http://docs.aws.Amazon.com/sns/latest/APIReference/API_Publish.html cela signifie que le point de terminaison est désactivé.

De http://docs.aws.Amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/sns/model/SetEndpointAttributesRequest.html :

Activé - indicateur qui active/désactive la livraison au point de terminaison. Le processeur de messages définira ce paramètre sur false lorsqu'un service de notification indique à SNS que le point de terminaison n'est pas valide. Les utilisateurs peuvent le redéfinir sur true, généralement après la mise à jour du jeton.

"service de notification" se réfère dans ce cas au GCM de Google, aux APNS de pommes ou à l'ADM d'Amazon.

16
tster

J'ai eu le même problème. C'est ce que j'ai fait:

  1. exporter le CERTIFICAT COMPLET de l'accès au trousseau vers un fichier .p12
  2. exporter la clé privée de Keychange Access vers un fichier * private.p12

  3. utilisez openssl avec le fichier .cer téléchargé (depuis iOS Developer MemberCenter) pour créer un certificat .pem public

  4. utilisez openssl avec le fichier * private.p12 généré pour créer un fichier de clés .pem privé

  5. Dans AWS SNS, créez une nouvelle application. Donne lui un nom. Choisissez Apple Development.
  6. Choisissez le CERTIFICAT COMPLET à partir de Keychain Access avec une extension .p12 et saisissez la phrase secrète que vous avez choisie lors de l'exportation à partir de Keychain Access Copiez le contenu du fichier public CERTIFICATE .pem, dans la zone de texte intitulée "Certificate", y compris les lignes de début et de fin :

    -----BEGIN CERTIFICATE-----
    -----END CERTIFICATE-----
    
  7. Copiez uniquement la partie du fichier .pem de clé privée commençant et se terminant par les lignes suivantes, dans la zone de texte intitulée "Clé privée":

    -----BEGIN RSA PRIVATE KEY-----
    -----END RSA PRIVATE KEY-----
    

J'utilise Cordova avec phonegap-plugin-Push 1.4.4, mais mon problème n'avait rien à voir avec phonecap. Mis à part un peu de confusion à propos de ce qui précède, ce qui a finalement fait l'affaire pour moi, a été d'ouvrir mon projet dans XCode, de trouver la cible de mon projet, puis d'activer les notifications push. Cela ajoute automatiquement le droit "Notifications push" à l'ID d'application. La prochaine fois que l'application est installée sur votre appareil, la notification push devrait fonctionner. Au moins, ça l'a fait pour moi.

J'espère que cela peut sauver une personne qui éprouve le même problème qu'une demi-journée de travail! :)

5
luposlip

Liste de contrôle rapide avant de prendre des mesures drastiques:

  1. Générez la demande de signature de certificat (CSR) à l'aide de Keychain App.
  2. Exportez le certificat APNS et sa clé privée dans un seul fichier p12 à l'aide de Keychain App.
  3. Lorsque vous créez une nouvelle application dans Amazon SNS, la plate-forme doit correspondre à l'environnement APNS (Développement/Production des deux côtés).
  4. Lorsque vous demandez un jeton d'appareil, vous devez être dans le bonne application (l'identifiant de bundle de l'application correspond au certificat APNS).
  5. Lorsque vous créez un nouveau point de terminaison de plateforme dans AWS SNS, le jeton d'appareil doit être ajouté à bonne application (le bon certificat d'application et la bonne plateforme de développement/production).

Dans mon cas, j'ai généré la CSR à l'aide d'un outil SSL tiers. J'ai obtenu un certificat valide auprès de Apple portail de développeur mais sans la clé privée. Ensuite, j'ai essayé l'outil de certificat de Windows pour exporter sans grand succès. Perte de temps. Démarrez votre Mac.

Ensuite, j'ai utilisé l'exemple d'application AmazonMobilePush pour obtenir un jeton d'appareil. Étant donné que l'identifiant de bundle de la démonstration ne correspond pas à mon certificat, le point de terminaison n'était pas valide. À chaque envoi SNS, le point d'extrémité est devenu désactivé (faux). Au final, la cause était évidente, mais je perds encore un temps précieux.

4
rjobidon

J'utilise ça. Si la réponse get endpoint trouve l'erreur NotFound, elle crée un point de terminaison (cela ne devrait jamais se produire, mais bon sang, c'est sur le site Web de documentation AWS SNS). Si cela ne se produit pas, cela signifie que vous obtenez les informations pour le point de terminaison. Cela peut être correct (les jetons correspondent et activé est vrai), ou l'inverse (dans ce cas, vous devez le mettre à jour).

    - (void)getEndpointDetailsWithResponse:(void(^)(AWSSNSGetEndpointAttributesResponse *response, AWSTask *))handleResponse {
    NSString * deviceTokenForAWS = [self deviceTokenForAWS];
    AWSSNS *manager = [AWSSNS SNSForKey:@"EUWest1SNS"];

    AWSSNSGetEndpointAttributesInput *input = [AWSSNSGetEndpointAttributesInput new];
    input.endpointArn = self.endpointArn;
    AWSTask *getEndpointAttributesTask = [manager getEndpointAttributes:input];
    [getEndpointAttributesTask continueWithBlock:^id(AWSTask *task) {
        NSLog(@"%@ Error: %@", task.result, task.error);


        AWSSNSGetEndpointAttributesResponse *result = task.result;
        NSError *error = task.error;

        if (error.code == AWSSNSErrorNotFound) {
            [self createEndpointWithResponse:^(AWSSNSCreateEndpointResponse *createResponse) {


                dispatch_async(dispatch_get_main_queue(), ^{
                    if (handleResponse != nil) {
                        handleResponse(result, task);
                    }
                });
            }];
        } else {

            NSLog(@"response for get endpoint attributes : %@", result);

            NSString *token = [result.attributes valueForKey:@"Token"];
            NSString *enabled = [result.attributes valueForKey:@"Enabled"];
            NSLog(@"token : %@, enabled : %@", token, enabled);
            BOOL wasSuccessful = [token isEqualToString:deviceTokenForAWS] && ([enabled localizedCaseInsensitiveCompare:@"true"] == NSOrderedSame);

            if (!wasSuccessful) {
                NSLog(@"device token does not match the AWS token OR it is disabled!");
                NSLog(@"Need to update the endpoint");

                AWSSNSSetEndpointAttributesInput *seai = [AWSSNSSetEndpointAttributesInput new];
                seai.endpointArn = self.endpointArn;

            NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:deviceTokenForAWS, @"Token", @"true", @"Enabled", nil];
            seai.attributes = attributes;

                AWSTask *setEndpointAttributesTask = [manager setEndpointAttributes:seai];
                [setEndpointAttributesTask continueWithBlock:^id(AWSTask *task) {
                    NSLog(@"response : %@, error: %@", task.result, task.error);

                    dispatch_async(dispatch_get_main_queue(), ^{
                        if (handleResponse != nil) {
                            handleResponse(result, task);
                        }
                    });
                    return nil;
                }];

            } else {
                NSLog(@"all is good with the endpoint");

                dispatch_async(dispatch_get_main_queue(), ^{
                    if (handleResponse != nil) {
                        handleResponse(result, task);
                    }
                });
            }
        }
        return nil;
    }];
}

Il s'agit de la réplique exacte de la documentation de gestion des jetons AWS SNS trouvée ici: https://mobile.awsblog.com/post/Tx223MJB0XKV9RU/Mobile-token-management-with-Amazon-SNS

Je peux joindre le reste de mon implémentation si nécessaire, mais cette partie est la plus importante.

1
Danut Pralea

Si vous obtenez l'erreur End Point is Disabled, utilisez le code ci-dessous pour activer endPoint, puis Push Notification à l'aide des informations d'identification Amazon:

*//Enable Device*

var sns = new AmazonSimpleNotificationServiceClient("AwsAccesskeyId", "AwsSecrteAccessKey", RegionEndpoint.USWest1);
Dictionary<string, string> objDictCheckEndpointEnable = new Dictionary<string, string>();
objDictCheckEndpointEnable.Add("Enabled", "False");
sns.SetEndpointAttributes(new SetEndpointAttributesRequest
    {
        Attributes = objDictCheckEndpointEnable,
        EndpointArn = "AwsEndPointArn" //This is Device End Point Arn
    });

*//End*
1
Sanjay Dwivedi

Pour moi, j'obtenais le "jeton de plate-forme associé au point de terminaison n'est pas valide" car mes points de terminaison d'application de plate-forme SNS n'étaient pas configurés correctement. Plus précisément, la console SNS ne lisait pas correctement les informations d'identification de mon fichier .p12 même si elle contenait le certificat et la clé privée corrects. La solution, basée sur cet article , a été de créer un deuxième fichier .p12 contenant le certificat et aucune clé. J'ai chargé les informations d'identification à partir du premier fichier .p12, puis chargé le deuxième fichier .p12 d'informations d'identification. Je pouvais voir la chaîne de certificats changer quand je le faisais, et après, je n'ai eu aucun problème.

Si vous créez un point de terminaison de production, SNS vous avertira des certificats incompatibles, mais il ne vérifie pas les points de terminaison de développement. La seule façon de savoir que le point de terminaison est borked est lorsque vous obtenez l'erreur de jeton de plate-forme.

J'espère bien que cela aidera quelqu'un là-bas, car cela m'a conduit à la distraction.

1
phatmann