Google Assistant placement permissions not saved between requests

With API.AI and Google Assistant, I request permission to get a username and location. The goal is that I will be able to request permission once, and subsequent requests to my action will not need to be re-requested (since this will lead to a very uneven conversation every time the user proceeds to my action).

What I find is that I receive information only in an intent tied to actions_intent_PERMISSION- information is not sent in other intentions, even if I have already granted permission. (In the code example below, this ends with a repeated request for permission for all other intentions.)

I also do not see this permission supported between calls to my Action. Therefore, every time an action is triggered, they (again) ask if they grant permission for the action.

Both behaviors seem strange. Application models, in general, do not require me to re-authorize resource permissions between application calls or even when the application starts. Even web pages retain authorization during the session. Am I doing something wrong, or is this behavior as intended?

The code that executes (this is executed in the Google Cloud functions, and there is an additional structure that makes these calls through Promise - this is only the corresponding part of the code). res.send(200)just tells API.AI that it should use the answers that are defined there, and that works without a problem. return Promise.resolve(null);just ensures that other backup / error conditions are not met.


exports.process = function( req, res ){
  var app = new ApiAiApp({request:req, response:res});

  if( app.isPermissionGranted() ){
    res.send( 200 );
    return Promise.resolve( null );
  } else {
    return askPermission( req, res, app );
  }
};

var askPermission = function( req, res, app ){
  //app.tell('foo');
  let namePermission = app.SupportedPermissions.NAME;
  let preciseLocationPermission = app.SupportedPermissions.DEVICE_PRECISE_LOCATION;

  // Ask for more than one permission. User can authorize all or none.
  app.askForPermissions('To address you by name and know your location',
    [namePermission, preciseLocationPermission]);
  return Promise.resolve( null );
};

The destination API.AI that processes the request is actions_intent_PERMISSION:

Location result

Another intention that should have a user / location payload, but which is never called with this information

simple test

A screenshot from the simulator demonstrating it always asks for permission, unless it has been specifically provided:

screen screen screen

JSON is sent upon initial connection:


{
 "originalRequest": {
  "source": "google",
  "version": "2",
  "data": {
   "isInSandbox": true,
   "surface": {
    "capabilities": [
     {
      "name": "actions.capability.AUDIO_OUTPUT"
     },
     {
      "name": "actions.capability.SCREEN_OUTPUT"
     }
    ]
   },
   "inputs": [
    {
     "rawInputs": [
      {
       "query": "talk to my test app",
       "inputType": "KEYBOARD"
      }
     ],
     "intent": "actions.intent.MAIN"
    }
   ],
   "user": {
    "locale": "en-US",
    "userId": "APhe68HKWmHGe9cojGOMrX9WKQ0l"
   },
   "device": {},
   "conversation": {
    "conversationId": "1499807128489",
    "type": "NEW"
   }
  }
 },
 "id": "7e301f85-4178-4be6-8b7c-408bad3ef62b",
 "timestamp": "2017-07-11T21:05:28.504Z",
 "lang": "en",
 "result": {
  "source": "agent",
  "resolvedQuery": "GOOGLE_ASSISTANT_WELCOME",
  "speech": "",
  "action": "input.welcome",
  "actionIncomplete": false,
  "parameters": {},
  "contexts": [
   {
    "name": "google_assistant_welcome",
    "parameters": {},
    "lifespan": 0
   },
   {
    "name": "actions_capability_screen_output",
    "parameters": {},
    "lifespan": 0
   },
   {
    "name": "actions_capability_audio_output",
    "parameters": {},
    "lifespan": 0
   },
   {
    "name": "google_assistant_input_type_keyboard",
    "parameters": {},
    "lifespan": 0
   }
  ],
  "metadata": {
   "intentId": "f31e371a-db9e-4e00-8002-546ec14d40a9",
   "webhookUsed": "true",
   "webhookForSlotFillingUsed": "false",
   "nluResponseTime": 2,
   "intentName": "Default Welcome Intent"
  },
  "fulfillment": {
   "speech": "I'm not sure, I'm a little confused.",
   "messages": [
    {
     "type": 0,
     "speech": "I'm not sure, I'm a little confused."
    }
   ]
  },
  "score": 1
 },
 "status": {
  "code": 200,
  "errorType": "success"
 },
 "sessionId": "1499807128489"
}

JSON , , . , originalRequest.data.user originalRequest.data.device .


{
 "originalRequest": {
  "source": "google",
  "version": "2",
  "data": {
   "isInSandbox": true,
   "surface": {
    "capabilities": [
     {
      "name": "actions.capability.AUDIO_OUTPUT"
     },
     {
      "name": "actions.capability.SCREEN_OUTPUT"
     }
    ]
   },
   "inputs": [
    {
     "rawInputs": [
      {
       "query": "yes",
       "inputType": "KEYBOARD"
      }
     ],
     "arguments": [
      {
       "rawText": "yes",
       "textValue": "true",
       "name": "PERMISSION"
      }
     ],
     "intent": "actions.intent.PERMISSION"
    }
   ],
   "user": {
    "profile": {
     "displayName": "Allen Firstenberg",
     "givenName": "Allen",
     "familyName": "Firstenberg"
    },
    "locale": "en-US",
    "userId": "APhe68HKWmHGe9cojGOMrX9WKQ0l"
   },
   "device": {
    "location": {
     "coordinates": {
      "latitude": 37.4219806,
      "longitude": -122.0841979
     }
    }
   },
   "conversation": {
    "conversationId": "1499807128489",
    "type": "ACTIVE",
    "conversationToken": "[\"_actions_on_google_\"]"
   }
  }
 },
 "id": "7a75593e-55d0-4962-ad91-564d47e5df13",
 "timestamp": "2017-07-11T21:05:43.391Z",
 "lang": "en",
 "result": {
  "source": "agent",
  "resolvedQuery": "actions_intent_PERMISSION",
  "speech": "",
  "action": "",
  "actionIncomplete": false,
  "parameters": {},
  "contexts": [
   {
    "name": "actions_capability_screen_output",
    "parameters": {},
    "lifespan": 0
   },
   {
    "name": "_actions_on_google_",
    "parameters": {},
    "lifespan": 99
   },
   {
    "name": "actions_intent_permission",
    "parameters": {
     "PERMISSION": "true"
    },
    "lifespan": 0
   },
   {
    "name": "actions_capability_audio_output",
    "parameters": {},
    "lifespan": 0
   },
   {
    "name": "google_assistant_input_type_keyboard",
    "parameters": {},
    "lifespan": 0
   }
  ],
  "metadata": {
   "intentId": "5d154d71-63f1-43a9-9c18-70d78bfd700f",
   "webhookUsed": "true",
   "webhookForSlotFillingUsed": "false",
   "nluResponseTime": 1,
   "intentName": "Location result"
  },
  "fulfillment": {
   "speech": "you're allowed",
   "messages": [
    {
     "type": 0,
     "speech": "you're allowed"
    }
   ]
  },
  "score": 1
 },
 "status": {
  "code": 200,
  "errorType": "success"
 },
 "sessionId": "1499807128489"
}

JSON , (), " ". , , , .


{
 "originalRequest": {
  "source": "google",
  "version": "2",
  "data": {
   "isInSandbox": true,
   "surface": {
    "capabilities": [
     {
      "name": "actions.capability.AUDIO_OUTPUT"
     },
     {
      "name": "actions.capability.SCREEN_OUTPUT"
     }
    ]
   },
   "inputs": [
    {
     "rawInputs": [
      {
       "query": "simple test",
       "inputType": "KEYBOARD"
      }
     ],
     "arguments": [
      {
       "rawText": "simple test",
       "textValue": "simple test",
       "name": "text"
      }
     ],
     "intent": "actions.intent.TEXT"
    }
   ],
   "user": {
    "locale": "en-US",
    "userId": "APhe68HKWmHGe9cojGOMrX9WKQ0l"
   },
   "device": {},
   "conversation": {
    "conversationId": "1499807128489",
    "type": "ACTIVE",
    "conversationToken": "[\"_actions_on_google_\"]"
   }
  }
 },
 "id": "f1804e02-bafc-4656-8726-0955bfb4f75d",
 "timestamp": "2017-07-11T21:05:55.001Z",
 "lang": "en",
 "result": {
  "source": "agent",
  "resolvedQuery": "simple test",
  "speech": "",
  "action": "",
  "actionIncomplete": false,
  "parameters": {},
  "contexts": [
   {
    "name": "actions_capability_screen_output",
    "parameters": {},
    "lifespan": 0
   },
   {
    "name": "_actions_on_google_",
    "parameters": {},
    "lifespan": 98
   },
   {
    "name": "actions_capability_audio_output",
    "parameters": {},
    "lifespan": 0
   },
   {
    "name": "google_assistant_input_type_keyboard",
    "parameters": {},
    "lifespan": 0
   }
  ],
  "metadata": {
   "intentId": "48257e82-3615-4445-8ea2-be21980b7115",
   "webhookUsed": "true",
   "webhookForSlotFillingUsed": "false",
   "nluResponseTime": 4,
   "intentName": "simple test"
  },
  "fulfillment": {
   "speech": "",
   "messages": [
    {
     "type": 0,
     "speech": ""
    }
   ]
  },
  "score": 1
 },
 "status": {
  "code": 200,
  "errorType": "success"
 },
 "sessionId": "1499807128489"
}

.

+6
1
+6

All Articles