1

我正在尝试在 nodejs 调度程序应用程序中实现天蓝色登录,然后想将文件上传到共享点。
首先我需要登录,然后获取访问令牌、刷新令牌、管理员访问令牌等。
当我尝试获取访问令牌时,我得到了这样的错误。
这里没有使用任何前端。

URL= ' https://login.microsoftonline.com/ ' + TENANT_ID + '/oauth2/token',
状态码错误:400 -
"{"error":"invalid_grant","error_description":"AADSTS50058: 无声符号-in 请求已发送,但没有用户登录。\r\n跟踪 ID: 05db5c6a-155c-4870-9bca-a518b5931900\r\n相关 ID: 1e8372d0-c1ba-4070-88d7-597e9cb5cb2c\r\n时间戳: 2019-08 -14 12:04:42Z","error_codes":[50058],"timestamp":"2019-08-14 12:04:42Z","trace_id":"05db5c6a-155c-4870-9bca-a518b5931900", "correlation_id":"1e8372d0-c1ba-4070-88d7-597e9cb5cb2c","error_uri":" https://login.microsoftonline.com/error?code=50058 \"}"

这里的代码

async function init(parsedBody) {
var jwtToken = await sharepointAuth.getJWTToken(parsedBody);
console.log("jwtToken:",jwtToken)
const config = {
JWK_URI: appConstants.JWK_URI,
ISS: appConstants.ISS,
AUD: appConstants.conf.AUD,
};
console.log(config)
await azureJWT.verify(jwtToken, config).then(async () => {
console.log("----------------------------------")
var fileName = 'analytics.min.js';
var filePath = './public/analytics.min.js';
var userAccessToken = await getAccessToken(jwtToken);
console.log("userAccessToken:", userAccessToken);
var accessTokenObj = await sharepointAuth.getAdminAccessToken();
accessToken = accessTokenObj.access_token;
console.log("accessToken:", accessToken)
fs.readFile(filePath, { encoding: null }, function (err, data) {
const relativeUrl = web/GetFolderByServerRelativeUrl('${selectedFolderName}');
const SHAREPOINT_HEADER = {
'Authorization': Bearer ${accessToken},
"Content-Type": application/json;odata=verbose,
'Accept': 'application/json;odata=verbose',
}
const options = {
method: "POST",
uri: ${SHAREPOINT_URI}${relativeUrl}/Files/add(url='${fileName}',overwrite=true),
headers: SHAREPOINT_HEADER,
body: data
};
console.log(options)
rp(options)
.then(() => {
// POST succeeded...
console.log('File uploaded!');
})
.catch((error) => {
// POST failed...
console.log("File Upload Error: ", error.toString());
});
});
});
}
const request = require("request");
const endpoint = "https://login.microsoftonline.com/tenentId/oauth2/token";
const requestParams = {
grant_type: "client_credentials",
client_id: "ClientId",
client_secret: "Secret",
resource: "ClientId"
};

request.post({ url: endpoint, form: requestParams }, function (err, response, body) {
if (err) {
console.log("error");
}
else {
console.log("Body=" + body);
let parsedBody = JSON.parse(body);
if (parsedBody.error_description) {
console.log("Error=" + parsedBody.error_description);
}
else {
console.log("parsedBody : " + parsedBody);
console.log("Access Token=" + parsedBody.access_token);
init(parsedBody);
}
}
});

function getAccessToken(jwtToken) {
return new Promise(async (resolve) => {
try {
const options = {
method: 'POST',
uri: URL,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
formData: {
grant_type: appConstants.OTB_GRANT_TYPE,
client_id: appConstants.conf.AUD,
client_secret: appConstants.conf.CLIENT_SECRET,
resource: appConstants.OTB_RESOURCE_URI2,
client_assertion_type: appConstants.OTB_CLIENT_ASSERTION_TYPE,
requested_token_use: appConstants.OTB_REQ_TOKEN_USE,
scope: appConstants.OTB_SCOPE,
assertion: jwtToken,
},
};
console.log("options:", options)
await rp(options)
.then(async (parsedBody) => {
// POST succeeded...
const result = JSON.parse(parsedBody);
console.log("****************************************** result", result)
refreshToken = result.refresh_token;

      resolve(result.access_token);
    })
    .catch((error) => {
      // POST failed...
      console.log('getAccessTokenRequestError: ', error.toString());
      resolve(appConstants.ACCESS_TOKEN_ERROR);
    });
} catch (error) {
  console.log('getAccessTokenRequestPromiseError: ', error.toString());
  resolve(appConstants.MIDDLEWARE_ERROR);
}
});
}

我不知道没有前端的天蓝色登录。我想登录 azure 并将文件上传到节点中调度程序应用程序的共享点。

首先,我需要使用客户端 ID 和密码登录。然后我得到了不记名令牌。然后我想通过使用承载令牌来获取访问令牌。那时我得到这样的错误。

AADSTS50058:已发送静默登录请求,但没有用户登录

4

1 回答 1

0

为什么不以这种方式获取访问令牌(客户端凭据流)?

const request = require("request");

const endpoint =
  "https://login.microsoftonline.com/{tenant}/oauth2/token";
const requestParams = {
  grant_type: "client_credentials",
  client_id: "",
  client_secret: "",
  resource: "https://mydomain.sharepoint.com"
};

request.post({ url: endpoint, form: requestParams }, function(
  err,
  response,
  body
) {
  if (err) {
    console.log("error");
  } else {
    console.log("Body=" + body);
    let parsedBody = JSON.parse(body);
    if (parsedBody.error_description) {
      console.log("Error=" + parsedBody.error_description);
    } else {
      console.log("Access Token=" + parsedBody.access_token);
    }
  }
});

如果您需要包含登录用户消息的访问令牌,您可以使用ROPC 流

const request = require("request");

const endpoint =
  "https://login.microsoftonline.com/{tenant}/oauth2/token";

const requestParams = {
  grant_type: "password",
  username: "",
  password: "",
  client_id: "",
  resource: "https://mydomain.sharepoint.com"
};

request.post({ url: endpoint, form: requestParams }, function(
  err,
  response,
  body
) {
  if (err) {
    console.log("error");
  } else {
    console.log("Body=" + body);
    let parsedBody = JSON.parse(body);
    if (parsedBody.error_description) {
      console.log("Error=" + parsedBody.error_description);
    } else {
      console.log("Access Token=" + parsedBody.access_token);
    }
  }
});
于 2019-08-15T03:32:16.407 回答