Search code examples
aws-lambdaactions-on-googlegoogle-homegoogle-smart-home

Can't get oauth token from google smart home action sync intent in aws lambda


I am using aws lambda function for google smart home action. I used aws api gateway for fulfillment url to reach lambda. I can successfully handle google assistant's intents with below code:-

const {smarthome} = require('actions-on-google');
const app = smarthome();

app.onExecute((body, headers) => {
  return {
    requestId: 'ff36...',
    payload: {
      // ...
    },
  };
});

app.onQuery((body, headers) => {
  return {
    requestId: 'ff36...',
    payload: {
      // ...
    },
  };
});

app.onSync((body, headers) => {
  console.log("body: "+JSON.stringify(body));
  console.log("headers: "+JSON.stringify(headers));
  return {
    requestId: 'ff36...',
    payload: {
      // ...
    },
  };
});

exports.handler = app;

On hard coding device details in this function, It can successfully reflect in google home app. But to get actual devices of user I need to get oauth token from "SYNC" intent. But all I got from this code is this output:-

body: {"inputs":[{"intent":"action.devices.SYNC"}],"requestId":"5604033533610827657"}

headers: {}

Unlike "Discover Directive" of Alexa's skill, which contains token in request.directive.endpoint.scope.token, google's intent doesn't seems to carry it. For O Auth, I am using AWS Cognito which works fine with Alexa Account linking and for google home too it can successfully link the account and show devices which I hardcode in lambda function.

As per this answer, the token is in

headers.authorization.substr(7)

I've tried that and got nothing. It shows

"Cannot read property 'substr' of undefined".


Solution

  • The lambda handler in the Actions on Google client library assumes that the request headers are present at event.headers within the input event parameter of a Lambda Proxy Integration. If you have a custom Lambda integration or have otherwise modified the input mapping, you may need to edit your mapping template to ensure the headers are placed where the client library expects.