Как выдать токены из Azure AD в приложении / API Node.js? - PullRequest
0 голосов
/ 11 октября 2018

Я создаю приложение для узла с экспресс-бэкендом.Одним из требований является использование Azure AD для проверки подлинности.Я установил модуль passport-azure-ad и настроил его следующим образом:

import * as passportAD from "passport-azure-ad";
// ... <snip> ....
const tenantName = "<MY_TENANT_NAME>"";
const clientID = "<MY_CLIENT_ID>";

app.use(passport.initialize());
app.use(passport.session());
const bearerStrategy = new passportAD.BearerStrategy(
  {
    identityMetadata: `https://login.microsoftonline.com/${tenantName}.onmicrosoft.com/.well-known/openid-configuration`,
    clientID
  },
  (token: any, done: any) => {
    console.log(token);
    return done(null, {}, token);
  }
);
passport.use(bearerStrategy);

Затем я добавил авторизацию для маршрута следующим образом:

const myHandler = () => (req, res) => return res.json({});
app.get('/my/route',
        passport.authenticate("oauth-bearer", { session: false }),
        myHandler()
);

Это возвращаетсяоднако, как и ожидалось, в состоянии 401 я не смог найти документацию о том, как выдать токен клиенту из Azure AD.Я хочу принять POST для конечной точки входа в систему с именем пользователя и паролем в теле и вернуть токен Azure AD.Возможно ли это?

Ответы [ 2 ]

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

Единственным эмитентом токена Azure AD является Azure AD.Вы должны не собирать имя пользователя / пароль в своих клиентах, и вы должны не принимать их в вашем сервисе.

Вашим клиентским приложениям просто нужно использовать MSAL (или ADAL, или любую клиентскую библиотеку OpenID Connect), чтобы отправить пользователя в Azure AD, заставить его войти в систему и в ответ получить токен доступа для вашего API.

Например, если ваш клиент был одностраничным приложением JavaScript, с MSAL для JavaScript вы могли бы сделать следующее:

var userAgentApplication = new Msal.UserAgentApplication(
    '0813e1d1-ad72-46a9-8665-399bba48c201', // AppId of you client app
    null, function (errorDes, token, error, tokenType, instance) {
        // This callback only used loginRedirect OR acquireTokenRedirect.
    }
);

var scopes = ["https://api.example.com/permission.scope"];
userAgentApplication.loginPopup(scopes).then(function (token) {

    // Get the signed-in user
    var user = userAgentApplication.getUser();

    // Get an access token for the signed-in user
    userAgentApplication.acquireTokenSilent(scopes).then(function (token) {

        // Use the access token to call your API
        $.ajax({
            url: 'https://api.example.com/foo',
            type: 'GET',
            dataType: 'json',
            headers: { 'Authorization': 'Bearer ' + token },
            contentType: 'application/json; charset=utf-8',
            success: function (result) {
                // TODO: Do something cool with the API response.
            },
            error: function (error) {
                // TODO: Do something smart if there's an error
            }
        });
    }, function (error) {
        // TODO: Silent token acquisition failed, retry with acquireTokenPopup()
    });
}, function (error) {
    // TODO: Deal with error.
});

(Конечно, вы можетесделать это для различных других платформ.)

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

В passport-azure-ad модуль, о том, как Azure объявление выпускает токен, вы можете сослаться на doc1 и doc2 .

я бынапример, принять POST к конечной точке входа в систему с именем пользователя и паролем в теле и вернуть токен Azure AD.Возможно ли это?

Да, это возможно.Если вы хотите сделать это, вы можете обратиться к здесь .

...