Javascript 如何将azure广告集成到使用azure中REST API的react web应用程序中
我有一个web应用程序是React,我已经为web应用程序本身配置了Azure AD身份验证。它的100%客户端站点应用程序,没有服务器端组件 我使用了这个组件: 我的代码如下: adalconfig.jsJavascript 如何将azure广告集成到使用azure中REST API的react web应用程序中,javascript,reactjs,azure-active-directory,adal,adal.js,Javascript,Reactjs,Azure Active Directory,Adal,Adal.js,我有一个web应用程序是React,我已经为web应用程序本身配置了Azure AD身份验证。它的100%客户端站点应用程序,没有服务器端组件 我使用了这个组件: 我的代码如下: adalconfig.js import { AuthenticationContext, adalFetch, withAdalLogin } from 'react-adal'; export const adalConfig = { tenant: 'mytenantguid', clientId:
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();
从“React”导入React;
从“react dom”导入react dom;
从“/DashApp”导入DashApp;
从“./registerServiceWorker”导入registerServiceWorker;
导入“antd/dist/antd.css”;
从“react adal”导入{runWithAdal};
从“/adalConfig”导入{authContext};
const DO_NOT_LOGIN=false;
runWithAdal(authContext,()=>{
ReactDOM.render(,document.getElementById('root'));
//热模块替换API
如果(模块热){
module.hot.accept('./dashApp.js',()=>{
const nextap=require('./dashApp')。默认值;
ReactDOM.render(,document.getElementById('root'));
});
}
},请勿登录);
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 };
从“React”导入React;
从“react redux”导入{Provider};
从“/redux/store”导入{store,history};
从“/router”导入PublicRoutes;
从“样式化组件”导入{ThemeProvider};
从“antd”导入{LocaleProvider};
从“react intl”导入{IntlProvider};
从“/settings/themes”导入主题;
从“/languageProvider”导入AppLocale;
导入配置{
getCurrentLanguage
}来自“/containers/LanguageSwitcher/config”;
从“/settings”导入{themeConfig};
从“/dashAppStyle”导入DashAppHolder;
从“/redux/Boot”导入引导;
恒电流应用程序=
AppLocale[getCurrentLanguage(config.defaultLanguage | | |“english”).locale];
const DashApp=()=>(
);
Boot()
.然后(()=>DashApp())
.catch(error=>console.error(error));
导出默认DashApp;
导出{AppLocale};
在此之前,一切正常,当用户未通过身份验证时,其将重定向到login.live.com进行身份验证,然后重定向回
不过,我还创建了另一个azure webapp来托管REST API,该REST API已经在azure AD中配置,因此尝试使用REST的用户将需要进行身份验证
现在的问题是:如何设置客户端应用程序以使用受Azure AD保护的REST API
我找到了这个,并查看了我正在查找的内容,但我不确定如何将其集成到上面的现有代码中
更新:
面向潜在读者
这个答案加上这个url上配置应用程序注册的说明帮助我解决了这个问题:这里的关键是
adalApiFetch
,在adalConfig.js
中定义。如您所见,它是adalFetch
的简单包装器。此方法(在中定义)接收ADAL实例(authContext
)、资源标识符(resourceGuiId
)、方法(fetch
)、URL(URL
)和对象(options
)。该方法执行以下操作:
authContext
)获取由resourceguid
标识的资源的访问令牌选项
对象的标题
字段(如果未提供,则创建一个)url
的给定“fetch”方法和选项
对象作为参数adalApiFetch
方法(您在adalConfig.js
中定义)只需使用adalConfig.endpoints.api
中标识的资源调用adalFetch
好的,那么您如何使用所有这些来发出REST请求,并在React应用程序中使用响应呢?让我们举个例子。在下面的示例中,我们将使用Microsoft Graph API作为受Azure AD保护的REST API。我们将通过它的友好标识符URI(“”)来识别它,但请记住,这也可能是Guid应用程序ID
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);
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();
"oauth2AllowImplicitFlow": true,
);
}
}
导出默认应用程序;
我仍然存在上述配置的问题。我在上面添加了更多的配置,效果很好。希望能有帮助
菲利普的回答让我走上了正确的道路,但我仍然遇到了一个问题,我的代币没有被接受 aadsTS700051:未为应用程序启用响应类型“令牌” 要解决此问题,我需要进入我的应用程序的注册>清单并将oauth2AllowImplicitFlow设置为true:
"oauth2AllowImplicitFlow": true,
注销你的Azure帐户,重新登录&你应该会收到你的用户详细信息。检查这可能会帮助你我收到此错误未经处理的拒绝(SyntaxError):JSON中的意外标记<位于位置0(匿名函数)src/containers/testREST.js:28我无法对我看不到的代码进行评论。你能和我分享错误代码吗?哦,事实上,我能看到足够多的错误来猜测问题是什么。您的API(
/values
)是否返回JSONresponse.json()
假设它是,并试图反序列化它,但找到一个是的这也是我的想法,我只是将格式化程序改为json而不是xml,测试react应用程序这就是问题所在,非常感谢,经过一周的努力终于可以工作了。
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'
},
cacheLocation: 'localStorage',
extraQueryParameter: 'prompt=admin_consent'
};
export const authContext = new AuthenticationContext(adalConfig);
"oauth2AllowImplicitFlow": true,