Скрытый секрет веб-чата Microsoft Bot Framework для Direct Line NODE JS

Мне нужно скрыть секрет прямого линейного канала с помощью веб-чата HTML, пробовал это решение, но при выборке постоянно возникают ошибки. Я получил секрет прямого канала на портале Azure в process.env

Index.js

const dotenv = require('dotenv');
const path = require('path');
const restify = require('restify');

const bodyParser = require('body-parser'); 
const request = require('request'); 
const corsMiddleware = require('restify-cors-middleware'); 


const { BotFrameworkAdapter, MemoryStorage, ConversationState, UserState   } = require('botbuilder');

const { EBOT } = require('./eBot');

const ENV_FILE = path.join(__dirname, '.env');
dotenv.config({ path: ENV_FILE || process.env.directLineSecret });

const cors = corsMiddleware({ 
  origins: ['*'] 
}); 

const server = restify.createServer();
server.pre(cors.preflight); 
server.use(cors.actual); 
server.use(bodyParser.json({ 
  extended: false 
})); 
server.listen(process.env.port || process.env.PORT || 3978, () => {
    console.log(`\n${ server.name } listening to ${ server.url }`);
    console.log('\nGet Bot Framework Emulator: https://aka.ms/botframework-emulator');
    console.log('\nTo talk to your bot, open the emulator select "Open Bot"');
});

// Generates a Direct Line token 
server.post('/directline/token', (req, res) => { 
  const options = { 
    method: 'POST', 
    uri: 'https://directline.botframework.com/v3/directline/tokens/generate', 
    headers: { 
      'Authorization': `Bearer ${process.env.directLineSecret}` 
    }};
  request.post(options, (error, response, body) => { 
    if (!error && response.statusCode < 300) { 
      res.send({ 
        token: body.token 
      }); 
    } else { 
      res.status(500).send('Call to retrieve token from DirectLine failed'); 
    } 
  }); 
});

server.post('/api/messages', (req, res) => {
    adapter.processActivity(req, res, async (context) => {
        await ebot.run(context);
    });
});

И webchat.html:

<script src="https://cdn.botframework.com/botframework-webchat/latest/webchat.js"></script>
<script>
            (async function () {
            const res = await fetch('https://directline.botframework.com/v3/directline/tokens/generate', { method: 'POST' });
            const webChatToken = await res.json();
    
              window.WebChat.renderWebChat({
                directLine: window.WebChat.createDirectLine({ token: webChatToken })
              }, document.getElementById('webchat'));
    
              document.querySelector('#webchat > *').focus();
            })().catch(err => console.error(err));
    
</script>

/// ОБНОВИТЬ

Ошибки:

** Не удалось загрузить ресурс: сервер ответил статусом 403 ()

** webchat.js: 2 POST https://directline.botframework.com/v3/directline/conversations 403

** webchat.js: 2 Uncaught t {сообщение: ошибка ajax 403, xhr: XMLHttpRequest, запрос: {…}, статус: 403, responseType: json,…}

В чем же тогда путь? Что мне не хватает?


person jsanchezs    schedule 21.10.2020    source источник


Ответы (2)


Проблема с вашей конкретной реализацией заключается в том, что, хотя вы настроили API для создания и передачи токена обратно в веб-чат, вы не можете на самом деле вызвать эту конечную точку. Вместо того

const res = await fetch('https://directline.botframework.com/v3/directline/tokens/generate', { method: 'POST' });

у тебя должно быть

const res = await fetch('http://localhost:3978/directline/token', { method: 'POST' });

Именно он вызовет обмен секрета прямой линии на токен и, в свою очередь, вернет токен обратно в ваш экземпляр веб-чата.

person Steven Kanberg    schedule 27.10.2020
comment
Спасибо за ваш любезный ответ, на самом деле мой бот уже развернут в Azure, поэтому я использую не localhost, а URL-адрес бота, я видел, что Api отвечает нормально, но я не получаю токен в ответе json, и поэтому он бросает это ошибка, есть идеи? - person jsanchezs; 27.10.2020
comment
Tbh, я создаю отдельный сервер токенов для звонков, но локальное тестирование сработало. API, который вы вызываете для получения токена, вы добавляете с помощью /directline/token? Кроме того, поскольку вы указываете секрет в переменных среды, добавили ли вы секрет в конфигурацию веб-приложения в качестве параметра приложения? Он будет иметь то же имя, которое вы указали в своем коде (например, directLineSecret. - person Steven Kanberg; 27.10.2020
comment
Да, конечно, сделал все это, любопытно, что API отвечает 200, поэтому выборка выполнена, но назначение webChatToken не определено .... ошибка возникает именно тогда, когда веб-чат пытается отобразить с этой переменной как токен. - person jsanchezs; 27.10.2020

Решил, проблема заключалась в том, как была создана функция токена api, это тот, который работал, чтобы получить ответ json из index.js:

server.post('/directline/token', async function(req, res) {
        const result = await fetch('https://directline.botframework.com/v3/directline/tokens/generate', {
            method: 'POST',
            headers: {
                Authorization: 'Bearer ' +  process.env.DirectLineSecret
            }
        });
        const token = await result.json();
        res.send(token);
});

Тот, который я разместил в вопросах, отправлял не ответ токена, а вместо этого огромный запрос ibject. Надеюсь, это поможет !

person jsanchezs    schedule 28.10.2020