In a webhook (written in Java), as part of an action configured for account linking with the following topology:
Actions-on-Google->Dialogflow->Webhook,
I am trying to extract the userId and OAuth accessToken from the incoming requests.
Both initial request (before the linking flow is started):
[java] 02-25-2019 16:41:33 [qtp2056234595-232] INFO domain.lola.user.utils.http.ControllerUtils [toString:30] - Received AoG Request {
[java] "responseId": "8da3a8c2-2d60-4675-b249-a39bbc1840c9",
[java] "queryResult": {
[java] "queryText": "GOOGLE_ASSISTANT_WELCOME",
[java] "parameters": {
[java] "any": ""
[java] },
[java] "allRequiredParamsPresent": true,
[java] "fulfillmentMessages": [{
[java] "text": {
[java] "text": [""]
[java] }
[java] }],
[java] "outputContexts": [{
[java] "name": "projects/speechbank-e8a15/agent/sessions/ABwppHEEjeH_tnJt20xAXWhtglLPVUHLgTuf1WVfDzN_FGr46jKppLq3P--zPd3g-3890FJu7hErWAdOZAQeBg/contexts/google_assistant_welcome",
[java] "parameters": {
[java] "any.original": "",
[java] "any": ""
[java] }
[java] }, {
[java] "name": "projects/speechbank-e8a15/agent/sessions/ABwppHEEjeH_tnJt20xAXWhtglLPVUHLgTuf1WVfDzN_FGr46jKppLq3P--zPd3g-3890FJu7hErWAdOZAQeBg/contexts/actions_capability_screen_output",
[java] "parameters": {
[java] "any.original": "",
[java] "any": ""
[java] }
[java] }, {
[java] "name": "projects/speechbank-e8a15/agent/sessions/ABwppHEEjeH_tnJt20xAXWhtglLPVUHLgTuf1WVfDzN_FGr46jKppLq3P--zPd3g-3890FJu7hErWAdOZAQeBg/contexts/google_assistant_input_type_voice",
[java] "parameters": {
[java] "any.original": "",
[java] "any": ""
[java] }
[java] }, {
[java] "name": "projects/speechbank-e8a15/agent/sessions/ABwppHEEjeH_tnJt20xAXWhtglLPVUHLgTuf1WVfDzN_FGr46jKppLq3P--zPd3g-3890FJu7hErWAdOZAQeBg/contexts/actions_capability_audio_output",
[java] "parameters": {
[java] "any.original": "",
[java] "any": ""
[java] }
[java] }, {
[java] "name": "projects/speechbank-e8a15/agent/sessions/ABwppHEEjeH_tnJt20xAXWhtglLPVUHLgTuf1WVfDzN_FGr46jKppLq3P--zPd3g-3890FJu7hErWAdOZAQeBg/contexts/actions_capability_media_response_audio",
[java] "parameters": {
[java] "any.original": "",
[java] "any": ""
[java] }
[java] }, {
[java] "name": "projects/speechbank-e8a15/agent/sessions/ABwppHEEjeH_tnJt20xAXWhtglLPVUHLgTuf1WVfDzN_FGr46jKppLq3P--zPd3g-3890FJu7hErWAdOZAQeBg/contexts/actions_capability_web_browser",
[java] "parameters": {
[java] "any.original": "",
[java] "any": ""
[java] }
[java] }],
[java] "intent": {
[java] "name": "projects/speechbank-e8a15/agent/intents/f645f492-f6dc-4e7e-8da6-45711c654ad0",
[java] "displayName": "RawText"
[java] },
[java] "intentDetectionConfidence": 1.0,
[java] "languageCode": "en-us"
[java] },
[java] "originalDetectIntentRequest": {
[java] "source": "google",
[java] "version": "2",
[java] "payload": {
[java] "isInSandbox": true,
[java] "surface": {
[java] "capabilities": [{
[java] "name": "actions.capability.AUDIO_OUTPUT"
[java] }, {
[java] "name": "actions.capability.MEDIA_RESPONSE_AUDIO"
[java] }, {
[java] "name": "actions.capability.WEB_BROWSER"
[java] }, {
[java] "name": "actions.capability.SCREEN_OUTPUT"
[java] }]
[java] },
[java] "inputs": [{
[java] "rawInputs": [{
[java] "query": "open speech Bank",
[java] "inputType": "VOICE"
[java] }],
[java] "intent": "actions.intent.MAIN"
[java] }],
[java] "user": {
[java] "userStorage": "{\"data\":{}}",
[java] "lastSeen": "2019-02-25T16:40:39Z",
[java] "locale": "en-US",
[java] "userId": "ABwppHFQHUBr0RrWA_OuL-kK2sxTPUvQtL3D-x2Ydr-7uxLt9zzEFzJrGB-X96d9XY8k9XTJj-RUg9WpzGB9jg"
[java] },
[java] "conversation": {
[java] "conversationId": "ABwppHEEjeH_tnJt20xAXWhtglLPVUHLgTuf1WVfDzN_FGr46jKppLq3P--zPd3g-3890FJu7hErWAdOZAQeBg",
[java] "type": "NEW"
[java] },
[java] "availableSurfaces": [{
[java] "capabilities": [{
[java] "name": "actions.capability.AUDIO_OUTPUT"
[java] }, {
[java] "name": "actions.capability.WEB_BROWSER"
[java] }, {
[java] "name": "actions.capability.SCREEN_OUTPUT"
[java] }]
[java] }]
[java] }
[java] },
[java] "session": "projects/speechbank-e8a15/agent/sessions/ABwppHEEjeH_tnJt20xAXWhtglLPVUHLgTuf1WVfDzN_FGr46jKppLq3P--zPd3g-3890FJu7hErWAdOZAQeBg"
[java] }
and the post-linking one:
[java] "responseId": "2aa05bec-9fd3-4387-8e87-ef70509395db",
[java] "queryResult": {
[java] "queryText": "actions_intent_SIGN_IN",
[java] "parameters": {
[java] },
[java] "allRequiredParamsPresent": true,
[java] "fulfillmentMessages": [{
[java] "text": {
[java] "text": [""]
[java] }
[java] }],
[java] "outputContexts": [{
[java] "name": "projects/speechbank-e8a15/agent/sessions/ABwppHEEjeH_tnJt20xAXWhtglLPVUHLgTuf1WVfDzN_FGr46jKppLq3P--zPd3g-3890FJu7hErWAdOZAQeBg/contexts/actions_capability_screen_output"
[java] }, {
[java] "name": "projects/speechbank-e8a15/agent/sessions/ABwppHEEjeH_tnJt20xAXWhtglLPVUHLgTuf1WVfDzN_FGr46jKppLq3P--zPd3g-3890FJu7hErWAdOZAQeBg/contexts/actions_intent_sign_in",
[java] "parameters": {
[java] "SIGN_IN": {
[java] "@type": "type.googleapis.com/google.actions.v2.SignInValue",
[java] "status": "OK"
[java] },
[java] "text": ""
[java] }
[java] }, {
[java] "name": "projects/speechbank-e8a15/agent/sessions/ABwppHEEjeH_tnJt20xAXWhtglLPVUHLgTuf1WVfDzN_FGr46jKppLq3P--zPd3g-3890FJu7hErWAdOZAQeBg/contexts/_actions_on_google",
[java] "lifespanCount": 98,
[java] "parameters": {
[java] "data": "{}"
[java] }
[java] }, {
[java] "name": "projects/speechbank-e8a15/agent/sessions/ABwppHEEjeH_tnJt20xAXWhtglLPVUHLgTuf1WVfDzN_FGr46jKppLq3P--zPd3g-3890FJu7hErWAdOZAQeBg/contexts/actions_capability_audio_output"
[java] }, {
[java] "name": "projects/speechbank-e8a15/agent/sessions/ABwppHEEjeH_tnJt20xAXWhtglLPVUHLgTuf1WVfDzN_FGr46jKppLq3P--zPd3g-3890FJu7hErWAdOZAQeBg/contexts/actions_capability_media_response_audio"
[java] }, {
[java] "name": "projects/speechbank-e8a15/agent/sessions/ABwppHEEjeH_tnJt20xAXWhtglLPVUHLgTuf1WVfDzN_FGr46jKppLq3P--zPd3g-3890FJu7hErWAdOZAQeBg/contexts/actions_capability_web_browser"
[java] }],
[java] "intent": {
[java] "name": "projects/speechbank-e8a15/agent/intents/88bbeb61-b612-47b1-b0e5-8d0de392a0c3",
[java] "displayName": "SignInIntent"
[java] },
[java] "intentDetectionConfidence": 1.0,
[java] "languageCode": "en-us"
[java] },
[java] "originalDetectIntentRequest": {
[java] "source": "google",
[java] "version": "2",
[java] "payload": {
[java] "isInSandbox": true,
[java] "surface": {
[java] "capabilities": [{
[java] "name": "actions.capability.WEB_BROWSER"
[java] }, {
[java] "name": "actions.capability.AUDIO_OUTPUT"
[java] }, {
[java] "name": "actions.capability.SCREEN_OUTPUT"
[java] }, {
[java] "name": "actions.capability.MEDIA_RESPONSE_AUDIO"
[java] }]
[java] },
[java] "inputs": [{
[java] "rawInputs": [{
[java] }],
[java] "arguments": [{
[java] "extension": {
[java] "@type": "type.googleapis.com/google.actions.v2.SignInValue",
[java] "status": "OK"
[java] },
[java] "name": "SIGN_IN"
[java] }, {
[java] "name": "text"
[java] }],
[java] "intent": "actions.intent.SIGN_IN"
[java] }],
[java] "user": {
[java] "userStorage": "{\"data\":{}}",
[java] "lastSeen": "2019-02-25T16:40:39Z",
[java] "accessToken": "token1",
[java] "locale": "en-US",
[java] "userId": "ABwppHFQHUBr0RrWA_OuL-kK2sxTPUvQtL3D-x2Ydr-7uxLt9zzEFzJrGB-X96d9XY8k9XTJj-RUg9WpzGB9jg"
[java] },
[java] "conversation": {
[java] "conversationId": "ABwppHEEjeH_tnJt20xAXWhtglLPVUHLgTuf1WVfDzN_FGr46jKppLq3P--zPd3g-3890FJu7hErWAdOZAQeBg",
[java] "type": "ACTIVE",
[java] "conversationToken": "[\"_actions_on_google\"]"
[java] },
[java] "availableSurfaces": [{
[java] "capabilities": [{
[java] "name": "actions.capability.WEB_BROWSER"
[java] }, {
[java] "name": "actions.capability.AUDIO_OUTPUT"
[java] }, {
[java] "name": "actions.capability.SCREEN_OUTPUT"
[java] }]
[java] }]
[java] }
[java] },
[java] "session": "projects/speechbank-e8a15/agent/sessions/ABwppHEEjeH_tnJt20xAXWhtglLPVUHLgTuf1WVfDzN_FGr46jKppLq3P--zPd3g-3890FJu7hErWAdOZAQeBg"
[java] }
seem to contain the userId
field. The accessToken
only starts appearing after the linking, which is correct.
However, in my webhook, in both cases I'm using the following to capture the userId
and accessToken
(aside from other things):
private void logUserDetails(ActionRequest request) {
String userId = request.getAppRequest().getUser().getUserId();
log.info("request.getAppRequest().getUser().getUserId()={}",userId);
String idToken = request.getUser().getIdToken();
log.info("idToken={}",idToken);
String usrId = request.getUser().getUserId();
log.info("request.getUser().getUserId()={}",usrId);
String queryText = request.getWebhookRequest().getQueryResult().getQueryText();
log.info("queryText={}", queryText);
}
and in both cases I'm seeing them both returned as null
:
pre account linking:
[java] 02-25-2019 16:41:33 INFO AoGApp [logUserDetails:23] - request.getAppRequest().getUser().getUserId()=null
[java] 02-25-2019 16:41:33 INFO AoGApp [logUserDetails:26] - idToken=null
[java] 02-25-2019 16:41:33 INFO AoGApp [logUserDetails:29] - request.getUser().getUserId()=null
[java] 02-25-2019 16:41:33 INFO AoGApp [logUserDetails:32] - queryText=GOOGLE_ASSISTANT_WELCOME
post account linking:
[java] 02-25-2019 16:43:25 INFO AoGApp [logUserDetails:23] - request.getAppRequest().getUser().getUserId()=null
[java] 02-25-2019 16:43:25 INFO AoGApp [logUserDetails:26] - idToken=null
[java] 02-25-2019 16:43:25 INFO AoGApp [logUserDetails:29] - request.getUser().getUserId()=null
[java] 02-25-2019 16:43:25 INFO AoGApp [logUserDetails:32] - queryText=actions_intent_SIGN_IN
Via the Java API, queryText
seems to be the only one extracting the actual value, but not so for the other fields from the incoming requests, where they are all null
.
I have a couple of questions:
At what point does the
userId
get created by Google and what triggers its creation? In other words, would there be a case where theuserId
in the request is actuallynull
, before its value has been generated, will I ever be able to see such situation in the request coming into my webhook?How can I extract other fields from the request coming into my webhook? What am I doing wrong such that parsing the request via Java API returns different results than the values seen on a raw request?