我正在尝试使用Adal JS进行隐式流。我创建了一个Dynamics 365试用实例,在该实例的Azure AD下,我创建了一个应用程序注册。我的单页应用程序执行以下操作,
用户尝试转到主页时,将用户重定向到https://login.microsoftonline.com/common/oauth2/authorize用户在其中成功登录的位置。
登录后,我正在使用getToken从Adal服务类获取令牌。
import {AuthenticationContext, withAdalLogin} from 'react-adal';
import ProjectConstant from './data/projectconstant'
export const authContext = new AuthenticationContext(ProjectConstant.adalSet);
export const acquireToken = (func) =>
authContext.acquireToken(ProjectConstant.adalSet.endpoints.api, func);
export const getToken = () =>{
let token = authContext.getCachedToken(ProjectConstant.adalSet.clientId);
if(authContext.getCachedUser() == null || token == null){
authContext.login();
}
return authContext.getCachedToken(ProjectConstant.adalSet.clientId);
}
export const withAdalLoginApi = withAdalLogin(authContext, ProjectConstant.adalSet.endpoints.api);
我使用此令牌对试验Dynamics 365实例执行查询,并且我获得了401错误,而fetch的代码在下面,
export const SearchAccount = () =>{
var token = getToken();
console.log("Token is" + token );
let url = "<trial>/api/data/v9.0/accounts";
fetch(url, {
method: 'get',
headers: new Headers({
'Authorization': 'Bearer '+ token,
'Accept' : 'application/json',
//'Cache-Control' : 'no-cache',
'Content-Type': 'application/json; charset=utf-8',
'OData-MaxVersion' : '4.0',
'OData-Version' :'4.0',
})})
.then(result => console.log(result));
}
我可以使用其他浏览器,并且在物理上登录到试验实例后,我可以在另一个选项卡中复制上面的粘贴URL,并正常显示所有数据。但是,如果我在应用程序正在运行的浏览器上执行相同的操作,我将在"新标签"上获得401。
我也可以按照以下步骤来使用邮递员https://learn.microsoft.com/en-us/dynamics365/customer-engagement/developer/webapi/setup-postman-environment并显示数据。
应用程序在实例中具有正确的特权级别。在每个三个条件下,唯一不同的是我生成的令牌,但是如果令牌是错误的,我是否应该遇到禁止错误?我不确定我在做什么错
似乎由于某种原因,authContext.getCachedUser()
返回的令牌给了我401。我正在查看任何相关的帖子此主题并找到了本文。他们出于某种原因使用了authContext.acquireToken(organizationURI, fncName)
。我使用了同样的东西,而且似乎在起作用。我将getToken()
更改为下方,
export const getToken = (fnc) =>{
if(authContext.getCachedUser() == null){
authContext.login();
}
authContext.acquireToken(ProjectConstant.adalSet.endpoints.api, fnc);
}
然后搜索方法变得如此,
export const SearchAccount = (fnc) =>{
getToken( async(error, token) => {
if(error === null && token !== null){
let url = ProjectConstant.adalSet.endpoints.api + "/api/data/v9.0/accounts?$select=name,websiteurl,address1_city,address1_country&$top=5";
fetch(url, {
method: 'get',
headers: new Headers({
"Authorization": "Bearer "+ token,
"Accept" : "application/json",
"Content-Type": "application/json; charset=utf-8",
"OData-MaxVersion" : "4.0",
"OData-Version" :"4.0",
})})
.then(res => res.json())
.then(res => fnc(res));
}
});
就像我说的那样工作,但我不确定早期方法有什么问题。对此的任何评论将不胜感激。