在使用通过adal.js生成的令牌的同时获取401

时间:2019-07-07 01:37:02

标签: adal adal.js

我正在尝试使用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);

我使用此令牌对动态365试用版实例执行查询,并且在以下提取代码的错误提示给我401,

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://docs.microsoft.com/en-us/dynamics365/customer-engagement/developer/webapi/setup-postman-environment 并显示数据。

应用程序(用户)在实例中具有正确的特权级别。在这三种情况下,唯一不同的是我生成的令牌,但是如果令牌错误,我是否不会收到禁止的错误?我不确定我在做什么错

1 个答案:

答案 0 :(得分:0)

似乎出于某种原因,authContext.getCachedUser()返回的令牌给了我401。我正在查看该主题的任何相关文章,并找到了article。他们出于某些原因使用了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));                
      }
  });

就像我说的那样,它现在可以工作,但是我不确定早期方法有什么问题。任何对此的评论将不胜感激。