Как вы можете реализовать расширение, которое подключается к услуге, требующей MFA? - PullRequest
1 голос
/ 30 октября 2019

Как бы вы реализовали расширение, которое подключается к внешней службе (Office365), для которой требуется MFA?

Фон

В настоящее время я использую расширениеSPGo (https://github.com/chrishasz/spgo), который позволяет пользователям взаимодействовать с Microsoft SharePoint Online. Недавно моей организации был необходим MFA и отключена возможность создания пароля приложения, как описано в этом выпуске (https://github.com/chrishasz/spgo/issues/32#issuecomment-380171567).

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

Ответы [ 2 ]

0 голосов
/ 12 ноября 2019

Автор SPGo здесь. Я действительно хотел бы добавить поддержку Office 365 MFA в SPGo, но в настоящее время это невозможно, пока VSCode не позволит автору расширения открыть внешний URI, а также получить доступ к объектам HTTP Request / Response. Для этого потребуется функциональная комбинация vscode.env.asExternalUri и vscode.env.openExternal apis. Решение будет работать следующим образом:

  1. Пользователь настраивает SPGo для использования MFA через мастер настройки, или spgo.json файл конфигурации
  2. SPGo открываетсеанс браузера в контексте расширения, указывающий на экран входа в систему MFA Office 365.
  3. при успешном входе в систему SPGo удаляет токен MFA из коллекции файлов cookie в сеансе.
  4. SPGo затемиспользовать этот токен для связи с SharePoint Online до истечения срока действия файла cookie

Насколько я понимаю, решение, о котором упоминал Ян выше, заключается в том, что оно будет работать для поставщика MFA, поддерживающего MFA на основе API, но Office 365. требует, чтобы вы обрабатывали полный вход в MFA через одно окно браузера. Когда я экспериментировал с этим раньше, VSCode не позволял мне открывать сеансы браузера внутри сессии. Может быть, это изменилось?

Чтобы конкретно ответить на ваш вопрос о том, как помочь получить это в SPGo, - я бы порекомендовал следующее:

  1. Создать проблему в Project GitHub. (Один из них был недавно создан здесь )
  2. Помогите создать решение, добавив репо, добавив функции и отправив запрос на извлечение.

Спасибо заиспользуя SPGo, и я ценю обратную связь! Пожалуйста, помогите мне отследить эту проблему по ссылке выше.

0 голосов
/ 02 ноября 2019

МФА - это действительно путь. Приложение браузера может легко аутентифицировать его, но настольные приложения должны выполнить дополнительную работу, направив конечного пользователя на страницу облачной аутентификации с помощью env.openExternal(uri) API. Служба аутентификации обычно должна знать о вашем приложении и знать, куда перенаправить страницу браузера при успешной аутентификации MFA. Переадресация должна идти к некоторому локальному http://localhost:port/auth-callback, который вы должны временно разместить внутри расширения VS Code, используя express. Вот некоторый псевдокод:

import express = require('express');
import http = require('http');

import { env } from 'vscode';

function getLoginAndGetToken(onSuccess: (token: string, ...) => void, onError: (message: string) => void) {

    var server: http.Server = null;

    app.post('/auth-callback', function (req:any, res:any) {
        server.close();
        try {
            // todo: check nonce req.body

            // extract the tokens from `req.body`
            onSuccess(req.body.xyzToken, ...);
            // todo: put some confirmation in `res`
            res.sendStatus(200);
        } catch (err) {
            onError(err);
            res.sendStatus(401);
        }
    });

    server = http.createServer(app);
    server.on('error', function (e) {
       onError(e.message);
    });
    server.listen(callbackPort);
    setTimeout( () => { server.close(); }, timeoutInMs );

    env.openExternal(cloudAuthUrl + nonce);
}

Затем вы используете токен для связи с облачными сервисами.

Вот учебник для веб-приложений node.js. https://docs.microsoft.com/en-us/outlook/rest/node-tutorial В нем подробно описываются особенности O365 OAuth2. По сути, вам необходимо преобразовать его в псевдокод выше. Если у вас есть, поделитесь, пожалуйста.

...