web-dev-qa-db-fra.com

Comment obtenir un identifiant utilisateur Alexa?

Je construis une compétence Alexa, et cela nécessite que je stocke l'ID utilisateur d'un utilisateur. J'ai essayé de le récupérer avec event.session.user.userId. Cependant, lorsque j'appelle console.log(event.session.user.userId), la sortie est littéralement amzn1.ask.account.[unique-value-here]. J'ai examiné plusieurs questions similaires et aucune d'elles ne fournit une réponse suffisamment claire pour moi.

Je ne suis pas sûr s'il s'agit d'un bogue, d'une chose réservée aux développeurs, ou si l'utilisateur est simplement anonymisé. Si tel est le cas, existe-t-il un moyen d'obtenir l'identifiant utilisateur actuel? J'imagine qu'il y en aurait, puisque Amazon a écrit un guide complet à ce sujet ici: 

https://developer.Amazon.com/public/solutions/Alexa/alexa-skills-kit/docs/linking-an-Alexa-user-with-a-user-in-votre-système .

Cependant, après une longue journée de débogage, je ne suis pas sûr de savoir ce qui est réel et ce qui ne l’est plus.

 var request = require('request');
var firebase = require('firebase');
var config = {
    apiKey: "my-api-key",
    authDomain: "stuff...",
    databaseURL: "more stuff...",
    storageBucket: "even more stuff...",
};
firebase.initializeApp(config);
// Get a reference to the database
var database = firebase.database();

exports.handler = (event, context) => {
    try {
        // New session
        if (event.session.new) {
            // New Session
            console.log("NEW SESSION");
        }

        // Launch Request
        switch (event.request.type) {
            case "LaunchRequest":
                var url = "https://api.random.org/json-rpc/1/invoke";
                var myRequest = {
                    "jsonrpc": "2.0",
                    "method": "generateStrings",
                    "params": {
                        "apiKey": "another-api-key",
                        "n": "1",
                        "length": "3",
                        "characters": "abcdefghijklmnopqrstuvwxyz0123456789"
                    },
                    "id": 24
                }
                var pin;
                request.post(
                    url,
                    {json: myRequest},
                    function (error, response, body) {
                        if (!error && response.statusCode == 200) {
                            console.log(event.session.user.userId); // **Here**, output is literally amzn1.ask.account.[unique-value-here] 
                            pin = body.result.random.data[0];
                            writeUserPin(pin);
                            var welcome = "Welcome";
                            var pinStatement = "Your 3 letter or number pin is: " + processPinForSpeech(pin);
                            context.succeed(
                                generateResponse(
                                    buildSpeechletReponse(welcome + pinStatement, true),
                                    {}
                                )
                            );
                            console.log(pin);
                        }
                        else {
                            console.log(error);
                        }
                    }
                );
                console.log("LAUNCH REQUEST");
                break;
            // Intent Request
            case "IntentRequest":
                console.log("INTENT REQUEST");
                break;

            // Session Ended Request
            case "SessionEndedRequest":
                console.log("SESSION ENDED REQUEST");
                break;

            default:
                context.fail(`INVALID REQUEST TYPE: ${event.request.type}`);
        }
    }
    catch (error) {
        context.fail(`Exception: ${error}`);
    }

}
    // Helpers
buildSpeechletReponse = (outputText, shouldEndSession) => {
    return {
        outputSpeech : {
            type: "PlainText",
            text: outputText
        },
        shouldEndSession: shouldEndSession
    };
}

generateResponse = (speechletResponse, sessionAttributes) => {
    return {
        version: "1.0",
        sessionAttributes: sessionAttributes,
        response: speechletResponse
    };
}

function writeUserPin(pin) {
    console.log("writing stuff");
    firebase.database().ref('newPins/' + pin).set({
        num : ""
    });
}

function processPinForSpeech(pin) {
    var wordNumArr = ["zero", "one", "two", "three", "four",
     "five", "six", "seven", "eight", "nine"];
    processedPin = "";
    for (i = 0; i < pin.length; i++){
        var currentChar = pin.charAt(i);
        if (isNaN(Number(currentChar))){
            processedPin += currentChar + ". ";
        }
        else {
            processedPin += wordNumArr[Number(currentChar)] + ". ";
        }
    }
    return processedPin
}

Voici la sortie sur les journaux CloudWatch: 


16:16:19
START RequestId: 48e335c5-d819-11e6-bc01-a939911adc24 Version: $LATEST

16:16:19
2017-01-11T16:16:19.639Z    48e335c5-d819-11e6-bc01-a939911adc24    NEW SESSION

16:16:19
2017-01-11T16:16:19.758Z    48e335c5-d819-11e6-bc01-a939911adc24    LAUNCH REQUEST

16:16:20
2017-01-11T16:16:20.457Z    48e335c5-d819-11e6-bc01-a939911adc24    amzn1.ask.account.[unique-value-here]

16:16:20
2017-01-11T16:16:20.457Z    48e335c5-d819-11e6-bc01-a939911adc24    writing stuff

16:16:20
2017-01-11T16:16:20.520Z    48e335c5-d819-11e6-bc01-a939911adc24    dd2

16:16:20
END RequestId: 48e335c5-d819-11e6-bc01-a939911adc24

16:16:20
REPORT RequestId: 48e335c5-d819-11e6-bc01-a939911adc24  Duration: 1005.48 ms    Billed Duration: 1100 ms Memory Size: 128 MB    Max Memory Used: 38 MB
10
Miki P

Eh bien, il se trouve que je faisais tout correctement (pour une fois). La raison pour laquelle l'ID utilisateur était littéralement amzn1.ask.account. [Unique-valeur-ici] était parce que je le testais lors d'un événement test "Alexa Start Session" dans la console AWS Lambda. Lorsque j'ai demandé à mon Echo Dot de lancer la compétence, la clé réelle a été générée. Problème résolu. 

2
Miki P

Vous le faites bien. Ce amzn1.ask.account.[unique-value-here] est en fait l'identifiant complet de l'utilisateur. Vous pouvez le constater vous-même en activant votre compétence depuis un écho, en enregistrant plusieurs demandes dans votre compétence Alexa et en observant que la valeur userid entre ces demandes a la même valeur.

Par le Référence JSON :

userId: chaîne représentant un identificateur unique pour l'utilisateur qui fait la demande. La longueur de cet identifiant peut varier, mais n'est jamais plus de 255 caractères. Le userId est automatiquement généré quand un utilisateur active la compétence dans l'application Alexa. 

Remarque: Désactiver et réactiver une compétence génère un nouvel identifiant.

Si vous ne devez conserver que les attributs d'utilisateur entre les sessions, cette valeur sera suffisante et vous pourrez l'utiliser pour identifier cet utilisateur de manière unique, à condition que la compétence soit activée.

Si vous devez lier un compte, la valeur que vous recherchez est accessToken et réside dans le même objet user après le lien de compte ayant abouti. Par la même référence JSON que ci-dessus:

accessToken: un jeton identifiant l'utilisateur dans un autre système. C'est fourni uniquement si l'utilisateur a lié son compte avec succès. Voir Liaison d’un utilisateur Alexa avec un utilisateur de votre système pour plus de détails.

10
Anthony Neace