Azure Web App Bot - запуск события после завершения OAuth - PullRequest
0 голосов
/ 01 сентября 2018

Я следую этому примеру, чтобы реализовать OAuth с Salesforce, https://github.com/Microsoft/BotBuilder/blob/master/Node/examples/basics-oauth/app.js

Код

var bot = new builder.UniversalBot(connector, function (session) {
    builder.OAuthCard.create(connector, session, connectionName, "Please sign in", "Sign in", (createSignInErr, signInMessage) => {
        if (signInMessage) {
            session.send(signInMessage);
            session.userData.activeSignIn = true;
        } else {
            session.send("Something went wrong trying to sign you in.");
        }
    });
}).on("event", (event) => {         // Handle 'event' activities
        if (event.name == 'tokens/response') {
            // received a TokenResponse, which is how the Azure Bot Service responds with the user token after an OAuthCard
            bot.loadSession(event.address, (err, session) => {
                let tokenResponse = event.value;
                session.send('You are now signed in with token: ' + tokenResponse.token);
                session.userData.activeSignIn = false;
            });
        }
    });

В конце, есть событие, связывающее что-то вроде .on("event", (event) => { console.log(event); }, не работает.

Задача Я могу аутентифицировать пользователя без каких-либо проблем. Но не уверен, как добавить обработчик для на oAuth complete.

Обновление

Кнопка входа не работала на командах MS, поэтому я переписал код, как показано ниже,

var login = (session) => {
    const config = require('config');
    const botConfig = config.get('BOT');
    const connectionName = botConfig.OAUTH_CONNECTION_NAME;
    console.log('address', session.message.address);
    connector.getSignInLink(session.message.address, connectionName, function (getSignInLinkErr, link) {
        var msg = new builder.Message(session)
            .attachments([
                new builder.SigninCard(session)
                    .text("Please click this link to sign in first.")
                    .button("signin", link)
            ]);
        session.send(msg);
        builder.Prompts.text(session, "You must first sign into your account.");
    });
}
bot.dialog('signinPrompt', [
    (session, args) => {
        login(session);
    },
    (session, results) => {
        console.log('results', results);
    },
    (session, results) => {
        console.log('results', results);
    }
]);

bot.dialog('GreetingDialog', [
    (session, args, next) => {
        const isSignedIn = salesforce.isSignedIn(connector, session);
        if (!isSignedIn) {
            session.beginDialog('signinPrompt');
        } else {
            next();
        }
    },
    (session, results, next) => {
        console.log('session userdata', session.userData);
    }
]).triggerAction({
    matches: 'Greeting'
});

bot.on('trigger', function (message) {
    var queuedMessage = message.value;
    var reply = new builder.Message()
        .address(queuedMessage.address)
        .text('This is coming from the trigger: ' + queuedMessage.text);
    bot.send(reply);
});

bot.on("event", (event) => {         // Handle 'event' activities
    if (event.name == 'tokens/response') {
        // received a TokenResponse, which is how the Azure Bot Service responds with the user token after an OAuthCard
        bot.loadSession(event.address, (err, session) => {
            let tokenResponse = event.value;
            session.send('You are now signed in with token: ' + tokenResponse.token);
            session.userData.activeSignIn = false;
        });
    }
});

connector.onInvoke((event, cb) => {
    if (event.name == 'signin/verifyState') {
        // received a MS Team's code verification Invoke Activity
        bot.loadSession(event.address, (err, session) => {
            let verificationCode = event.value.state;
            // Get the user token using the verification code sent by MS Teams
            connector.getUserToken(session.message.address, connectionName, verificationCode, (err, result) => {
                session.send('You are now signed in with token: ' + result.token);
                session.userData.activeSignIn = false;
                cb(undefined, {}, 200);
            });
        });
    } else {
        cb(undefined, {}, 200);
    }
});

Мне удалось получить магический код после завершения аутентификации, но я не смог его подтвердить. Я действительно не уверен, как работает этот обратный вызов oauth. Откуда вы получаете информацию после завершения oauth? Я застрял здесь и не могу идти дальше. .on('trigger'), .on('event') и .onInvoke не работали.

Очень ценю любую помощь!

1 Ответ

0 голосов
/ 11 октября 2018

ТАК, похоже, у вас есть 2 проблемы здесь.

  1. Кнопка входа не будет работать в командах "из коробки", если вы не добавите домен фреймворка ботов в свой манифест, например token.botframework.com. Ниже я приведу пример полного манифеста. способ, которым вы пытаетесь, также будет работать, но не позволит войти без магического кода.

  2. Вы не получаете активную команду от команд. Для этого вам нужно добавить манифест в приложение вашей команды. Я опубликую пример этого ниже, но здесь есть страница документации , которая также может помочь.

вот как будет выглядеть манифест, вам нужно будет включить 2 изображения, используемые в разделе значков в папке, и сжать его, чтобы загрузить в команды

{
    "$schema": "https://statics.teams.microsoft.com/sdk/v1.0/manifest/MicrosoftTeams.schema.json",
    "manifestVersion": "1.0",
    "version": "1.0.0",
    "id": "{Your bot's app ID}",
    "packageName": "bot.builder",
    "developer": {
        "name": "{Your Name}",
        "websiteUrl": "https://example.com/",
        "privacyUrl": "https://example.com/privacy",
        "termsOfUseUrl": "https://example.com/app-tos"
    },
    "name": {
        "short": "{Name of your app}"
    },
    "description": {
        "short": "A Bot",
        "full": "This app displays information."
    },
     "icons": {
        "outline": "{Required image}",
        "color": "{Required image}"
     },
    "accentColor": "#0099ff",
    "bots": [
        {
            "botId": "{Your bot's app ID}",
            "isNotificationOnly": false,
            "needsChannelSelector": "true",
            "scopes": [
                "personal",
                "team"
            ]
        }
    ],
  "validDomains": [
     "token.botframework.com"
  ]
}
...