Я следую этому примеру, чтобы реализовать 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
не работали.
Очень ценю любую помощь!