Вход в Google: как легко декодировать токен, используя библиотеку выполнения диалогового окна вместо действий в Google? - PullRequest
0 голосов
/ 24 ноября 2018

Мне нужно получить адрес электронной почты из профиля пользователя Google.

Я использую Dialogflow и реализовал процедуру входа в Google , чтобы получить Client ID (выданныйGoogle для ваших действий), и я также выполняю actions.intent.SIGN_IN намерение (как объяснено здесь ).Я получаю токен Google ID, который содержит информацию о профиле Google пользователя, проблема заключается в расшифровке токена.

Если бы я использовал Действия в клиентской библиотеке Google для Node.js , яможно просто следовать примеру из потока аутентификации входа в Google :

Если вы используете клиентскую библиотеку Actions on Google для Node.js, она позаботится опроверяет и декодирует токен для вас и дает вам доступ к содержимому профиля , как показано в следующем фрагменте кода:

const { dialogflow } = require('actions-on-google');
const app = dialogflow({
  // REPLACE THE PLACEHOLDER WITH THE CLIENT_ID OF YOUR ACTIONS PROJECT
  clientId: CLIENT_ID,
})

// Intent that starts the account linking flow.
app.intent('Start Signin', conv => {
  conv.ask(new SignIn('To get your account details'))
})

// Create a Dialogflow intent with the `actions_intent_SIGN_IN` event.
app.intent('Get Signin', (conv, params, signin) => {
  if (signin.status === 'OK') {
    const payload = conv.user.profile.payload
    conv.ask(`I got your account details, ${payload.name}. What do you want to do next?`)
  } else {
    conv.ask(`I won't be able to save your data, but what do you want to do next?`)
  }
})

Проблема в том, что я использую Dialogflow Fulfillment Library (потому что я работаю с Google Assistant и и с другими интеграциями).

Из их примера кода я придерживаюсь этого подхода, используя WebhookClient:

const functions = require('firebase-functions');
const { WebhookClient } = require('dialogflow-fulfillment');

function someIntent(agent) {
  if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
    // let conv = agent.conv( );
    // do some google specific stuff... conv.ask( ... );
    agent.add('You came from Actions on Google');
  } else {
    agent.add('You came from any other source...');
  }
}

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
  const agent = new WebhookClient({ request, response });
  let intentMap = new Map( );
  intentMap.set('some-intent', someIntent);
  agent.handleRequest(intentMap);
});

Итак, вопрос : можно ли передать мои clientId (из моего проекта действий) в dialogflow-fulfillment для декодирования токена (так же, как actions-on-google делает)?

пс: я знаюТеперь есть библиотеки JWT-декодирования и предложенная процедура , которую я мог бы использовать для проверки и декодирования токена.Но так как dialogflow-fulfillment я предполагаю, что как-то использует actions-on-google для внутреннего использования, мне просто интересно, есть ли гораздо более простой способ сделать это.

Ответы [ 2 ]

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

** РЕДАКТИРОВАТЬ: **

Это еще короче и кажется правильным способом сделать это.Взято из https://developers.google.com/identity/sign-in/web/backend-auth#using-a-google-api-client-library, пример Node.js:

const {OAuth2Client} = require('google-auth-library');
const client = new OAuth2Client(CLIENT_ID);
async function verify() {
  const ticket = await client.verifyIdToken({
      idToken: token,  // <-- this comes from: conv.user.profile.token
      audience: CLIENT_ID,  // Specify the CLIENT_ID of the app that accesses the backend
      // Or, if multiple clients access the backend:
      //[CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3]
  });
  const payload = ticket.getPayload();
  const userid = payload['sub'];
  // If request specified a G Suite domain:
  //const domain = payload['hd'];
}
verify().catch(console.error);

** ОРИГИНАЛЬНЫЙ ОТВЕТ: **

TL; DR

const { OAuth2Client } = require('google-auth-library');
const CLIENT_ID = '<your own actions client id>.apps.googleusercontent.com';
const client = new OAuth2Client(CLIENT_ID);
...
// Then, on intent fulfillment method:
    let conv = agent.conv( );  // Get Actions on Google library conversation object
    let payload = await conv.user._verifyProfile(client, CLIENT_ID); // payload.email

Более длинная история:

Благодаря ссылке @ RezaNasiri на ИспользованиеКлиентская библиотека Google API , я закончил поиском, где в actions-on-google исходный код google-auth-library был использован.

Я обнаружил, что объект google Conversation имеет объект User , который включает метод _verifyProfile.Однако он должен быть скрытым, поэтому будьте осторожны при использовании его с другой версией библиотеки.

Так что, если вы используете dialogflow-executement клиент webhook:

const { WebhookClient } = require('dialogflow-fulfillment');

Вам нужно добавить google-auth-library:

const { OAuth2Client } = require('google-auth-library');
const CLIENT_ID = '<your own client id>.apps.googleusercontent.com';
const client = new OAuth2Client(CLIENT_ID);

Затем вы можете проверить и декодировать токен следующим образом.Здесь signInGetData - метод выполнения намерения actions.intent.SIGN_IN:

async function signInGetData(agent) {
  let ctx = agent.context.get('actions_intent_sign_in');
  let signin = ctx.parameters.SIGN_IN;
  let conv = agent.conv( );  // Get Actions on Google library conversation object

  if (signin.status === 'OK') {
    // let idToken = conv.user.profile.token; // here's the token, but we don't need it
    let payload = await conv.user._verifyProfile(client, CLIENT_ID); // <<-- HERE
    if ( payload.email ) {
      conv.ask(`Got your email: ${payload.email}`);
    } else {
      conv.ask(`Got profile but not authorized to get your email...`)
    }
  } else {
    conv.ask(`No access to user data. Never mind...`)
  }
  agent.add(conv);
}
0 голосов
/ 25 ноября 2018

Нет, насколько я знаю, проверка токена выполняется в классе Dialogflow в actions-on-google, который обрабатывает все действия и взаимодействие с API Dialogflow.Это заменяется на WebhookClient в библиотеке Dialogflow Fulfillment, которая этого не делает.Вы можете проверить эту ссылку для проверки токена .

...