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:
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
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.
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.