Сбой аутентификации клиента в запросе почтальона на умение Amazon Alexa Smart Home LWA - PullRequest
0 голосов
/ 21 ноября 2018

Я имею в виду документацию Amazon с целью аутентификации клиента.В настоящее время я использую LWA.

Шаги, за которыми я следовал:

  1. Я включил разрешение отправки событий Alexa из консоли разработчика Alexa на странице «Сборка> Разрешения».

  2. Я взял код гранта из запроса в журналах облачных часов, который был отправлен, когда я вошел в систему с помощью приложения Alexa Companion.

Пример: -

    {
     "directive": {
         "header": {
             "messageId": "Example",
             "name": "AcceptGrant",
             "namespace": "Alexa.Authorization",
             "payloadVersion": "3"
         },
         "payload": {
            "grant": {
                "code": "Example2",
                "type": "OAuth2.AuthorizationCode"
            },
            "grantee": {
                "token": "Example3",
                "type": "BearerToken"
            }
         }
      }
    }
Страница разрешений, созданная на консоли Alexa Developer, дала мне client-Id и client-secret, которые я использовал для отправки запроса на https://api.amazon.com/auth/o2/token.

Пример: -

 POST /auth/o2/token HTTP/l.l
 Host: api.amazon.com
 Content-Type: application/x-www-form-urlencoded;charset=UTF-8 
 grant_type=authorization_code&code=&client_id=&client_secret=

Я передал код client_id и client_secret в приведенном выше примере и сделал запрос на публикацию на этот URL https://api.amazon.com/auth/o2/token

Я попытался использовать x-www-form-urlencoded; charset = UTF-8, а также JSON для Content-Type.

Я выполнил шаг, описанный в приведенной выше документации, и застрялоб ошибке (401 Unauthorized):

{
    "error_description": "The request has an invalid grant parameter : code",
    "error": "invalid_grant"
}

Я попытался реализовать его, используя код Python и Postman.Завершение с тем же сценарием ошибки выше.

1 Ответ

0 голосов
/ 22 ноября 2018

Вот пример кода, который поможет вам и другим людям, которые хотят отправлять события на alexa gateway.

const AWS = require('aws-sdk');
AWS.config.update({region: 'eu-west-1'});

// Create the DynamoDB service object
const ddb = new AWS.DynamoDB({ apiVersion: 'latest' });
const doc = new AWS.DynamoDB.DocumentClient({
            convertEmptyValues: true,
            service: ddb
        });        

// Using 'request' for http POST and GET request.
// https://www.npmjs.com/package/requests
// npm install --save requests 
const r = require('request');

//Handle Authorization. Call this method from your lambda handler whenever you get Alexa.Authorization message. You will get this message only when you select permission to 
//send events in your Smart Home Skill.
//Access to Event gateway allows you to enable Proactive Device Discovery and 
//Proactive State Reporting in your skill
//More information on Alexa.Authorization can be found on https://developer.amazon.com/docs/device-apis/alexa-authorization.html
function handleAuthorization(request, context, user) {  

    //Even when you are using your own authentication, the url below will still
    //point to amazon OAuth token url. The token you obtain here has to be stored
    //separately for this user. Whenever sending an event to alexa event gateway you will
    //require this token.
    //URL below is for EU server. Look at following documentation link to identify correct url
    //for your system.
    //https://developer.amazon.com/docs/smarthome/send-events-to-the-alexa-event-gateway.html
    var url = "https://api.amazon.com/auth/o2/token";
    var body = {
        grant_type : 'authorization_code',
        code : request.directive.payload.grant.code,
        client_id : 'your client id from permissions page on developer portal where you enable alexa events. This is id different than one you specify in account linking settings',
        client_secret : 'client secret from permissions page'
    }

    //https://developer.amazon.com/docs/smarthome/authenticate-a-customer-permissions.html
    r.post({
      url:     url,
      form :  body
    }, function(error, response, b){    
        if (error) { return console.log(error); }
        var body = JSON.parse(b);
        var params = {
          TableName: 'Devices',
          Item: {
            'id' : user,
            'auth_token' : body.access_token,
            'refresh_token' : body.refresh_token
          }
        }
        log("DEBUG:", "Authorization Body", JSON.stringify(body));
        log("DEBUG:", "Authorization Response", JSON.stringify(response));
        log("DEBUG:", "Database Params", JSON.stringify(params));

        // Call DynamoDB to add the item to the table
        var putObjectPromise = doc.put(params).promise();
        //Store auth_token and refresh_token in database. We will need these
        //while sending events to event gateway.
        //Send a success response.
        putObjectPromise.then(function(data) {
            var response = {
              event: {
                header: {
                  messageId: request.directive.header.messageId,
                  namespace: "Alexa.Authorization",
                  name: "AcceptGrant.Response",
                  payloadVersion: "3"
                },
                "payload": {
                }
              }
            };

            context.succeed(response);
        }).catch(function(err) {
            //TODO - Add a Authorization error response JSON here.      
            console.log(err);
        });                         
    });                   
}
...