Как интегрировать рекламу Azure в реагирующее веб-приложение, которое использует REST API и в Azure - PullRequest
0 голосов
/ 12 мая 2018

У меня есть одно веб-приложение React, и я уже настроил проверку подлинности Azure AD для самого веб-приложения. Это 100% клиентское приложение на сайте, без серверных компонентов.

Я использовал этот компонент: https://github.com/salvoravida/react-adal

Мой код выглядит следующим образом: adalconfig.js

import { AuthenticationContext, adalFetch, withAdalLogin } from 'react-adal';

export const adalConfig = {
  tenant: 'mytenantguid',
  clientId: 'myappguid',
  endpoints: {
    api: '14d71d65-f596-4eae-be30-27f079bf8d4b',
  },
  cacheLocation: 'localStorage',
};

export const authContext = new AuthenticationContext(adalConfig);

export const adalApiFetch = (fetch, url, options) =>
  adalFetch(authContext, adalConfig.endpoints.api, fetch, url, options);

export const withAdalLoginApi = withAdalLogin(authContext, adalConfig.endpoints.api);

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import DashApp from './dashApp';
import registerServiceWorker from './registerServiceWorker';
import 'antd/dist/antd.css';

import { runWithAdal } from 'react-adal';
import { authContext } from './adalConfig';

const DO_NOT_LOGIN = false;

runWithAdal(authContext, () => {

  ReactDOM.render(<DashApp />, document.getElementById('root'));

  // Hot Module Replacement API
  if (module.hot) {
    module.hot.accept('./dashApp.js', () => {
      const NextApp = require('./dashApp').default;
      ReactDOM.render(<NextApp />, document.getElementById('root'));
    });
  }

},DO_NOT_LOGIN);


registerServiceWorker();

dashapp.js

import React from "react";
import { Provider } from "react-redux";
import { store, history } from "./redux/store";
import PublicRoutes from "./router";
import { ThemeProvider } from "styled-components";
import { LocaleProvider } from "antd";
import { IntlProvider } from "react-intl";
import themes from "./settings/themes";
import AppLocale from "./languageProvider";
import config, {
  getCurrentLanguage
} from "./containers/LanguageSwitcher/config";
import { themeConfig } from "./settings";
import DashAppHolder from "./dashAppStyle";
import Boot from "./redux/boot";

const currentAppLocale =
  AppLocale[getCurrentLanguage(config.defaultLanguage || "english").locale];


const DashApp = () => (
  <LocaleProvider locale={currentAppLocale.antd}>
    <IntlProvider
      locale={currentAppLocale.locale}
      messages={currentAppLocale.messages}
    >
      <ThemeProvider theme={themes[themeConfig.theme]}>
        <DashAppHolder>
          <Provider store={store}>
            <PublicRoutes history={history} />
          </Provider>
        </DashAppHolder>
      </ThemeProvider>
    </IntlProvider>
  </LocaleProvider>
);
Boot()
  .then(() => DashApp())
  .catch(error => console.error(error));

export default DashApp;
export { AppLocale };

До этого момента все работает нормально, когда пользователь не аутентифицирован, его перенаправляют на login.live.com для аутентификации, а затем перенаправляют обратно.

Однако я также создал другое веб-приложение Azure для размещения REST API, которое REST API уже настроено в Azure AD, поэтому пользователям, которые пытаются использовать остальное, потребуется пройти аутентификацию.

Теперь вопрос: как настроить приложение на стороне клиента для использования REST API, защищенного Azure AD .?

Я нашел это и посмотрел то, что искал, но я не уверен, как интегрировать это в мой существующий код выше

https://github.com/AzureAD/azure-activedirectory-library-for-js/issues/481

Обновление: Для потенциальных читателей

Этот ответ плюс инструкции по этому URL для настройки регистрации приложений помогли мне решить проблему: https://blog.ithinksharepoint.com/2016/05/16/dev-diary-s01e06-azure-mvc-web-api-angular-and-adal-js-and-401s/

1 Ответ

0 голосов
/ 21 мая 2018

Ключ здесь adalApiFetch, определенный в adalConfig.js.Как видите, это простая оболочка вокруг adalFetch.Этот метод (определенный в react-adal) получает экземпляр ADAL (authContext), идентификатор ресурса (resourceGuiId), метод (fetch), URL (url) иобъект (options).Метод выполняет следующие действия:

  1. Используйте экземпляр ADAL (authContext) для получения токена доступа для ресурса, обозначенного resourceGuiId.
  2. Добавьте этот токен доступа кheaders поле объекта options (или создайте его, если он не был предоставлен).
  3. Вызовите указанный метод "fetch", передав в качестве параметров url и объект options.

Метод adalApiFetch (который вы определили в adalConfig.js) просто вызывает adalFetch с ресурсом, указанным в adalConfig.endpoints.api.

Хорошо, так как вы используетевсе это, чтобы сделать запрос REST и использовать ответ в вашем приложении React?Давайте использовать пример.В следующем примере мы будем использовать Microsoft Graph API в качестве REST API, защищенного с помощью Azure AD.Мы будем идентифицировать его по его дружественному идентификатору URI ("https://graph.microsoft.com"),, но имейте в виду, что это может быть и идентификатор приложения Guid.

adalConfig.js определяет конфигурацию ADAL и экспортирует несколько вспомогательных методов:

import { AuthenticationContext, adalFetch, withAdalLogin } from 'react-adal';

export const adalConfig = {
tenant: '{tenant-id-or-domain-name}',
clientId: '{app-id-of-native-client-app}',
endpoints: {
    api: 'https://graph.microsoft.com' // <-- The Azure AD-protected API
},
cacheLocation: 'localStorage',
};

export const authContext = new AuthenticationContext(adalConfig);

export const adalApiFetch = (fetch, url, options) =>
adalFetch(authContext, adalConfig.endpoints.api, fetch, url, options);

export const withAdalLoginApi = withAdalLogin(authContext, adalConfig.endpoints.api);

index.js обертывает indexApp.js с помощью метода runWithAdal из react-adal, который гарантирует, что пользовательподписанный с Azure AD перед загрузкой indexApp.js:

import { runWithAdal } from 'react-adal';
import { authContext } from './adalConfig';

const DO_NOT_LOGIN = false;

runWithAdal(authContext, () => {

// eslint-disable-next-line
require('./indexApp.js');

},DO_NOT_LOGIN);

indexApp.js просто загружает и отображает экземпляр App, здесь ничего необычного:

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';

ReactDOM.render(<App />, document.getElementById('root'));
registerServiceWorker();

App.js - это простой компонент, в котором происходит волшебство:

  • Мы определяем значение state. В этом случае оно называется apiResponse, так как мыпросто отображая необработанный ответ API, но, конечно, вы можете назвать это состояние как угодно (или иметь несколько значений состояния).
  • Во время componentDidMount (которое запускается после того, как элемент доступен в DOM),мы вызываем adalApiFetch. Передаем fetch (из Fetch API как * 1Параметр 072 * и конечная точка для запроса REST, который мы хотим сделать (в данном случае конечная точка /me в Microsoft Graph):
  • В методе render мы просто отображаем это значение состояния вэлемент <pre>.
<code>import React, { Component } from 'react';
import { adalApiFetch } from './adalConfig';

class App extends Component {

  state = {
    apiResponse: ''
  };

  componentDidMount() {

    // We're using Fetch as the method to be called, and the /me endpoint 
    // from Microsoft Graph as the REST API request to make.
    adalApiFetch(fetch, 'https://graph.microsoft.com/v1.0/me', {})
      .then((response) => {

        // This is where you deal with your API response. In this case, we            
        // interpret the response as JSON, and then call `setState` with the
        // pretty-printed JSON-stringified object.
        response.json()
          .then((responseJson) => {
            this.setState({ apiResponse: JSON.stringify(responseJson, null, 2) })
          });
      })
      .catch((error) => {

        // Don't forget to handle errors!
        console.error(error);
      })
  }

  render() {
    return (
      <div>
        <p>API response:</p>
        <pre>{ this.state.apiResponse }
);}} экспортировать приложение по умолчанию;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...