1
votes

I am trying to implement azure login in nodejs scheduler app, and then want to upload file to share point.
First i need to login, then get access token,refresh token, admin access token etc.
When i try to get access token , i got error like this.
Here no use of any front end.

URL= 'https://login.microsoftonline.com/' + TENANT_ID + '/oauth2/token',
Status Code Error: 400 -
"{"error":"invalid_grant","error_description":"AADSTS50058: A silent sign-in request was sent but no user is signed in.\r\nTrace ID: 05db5c6a-155c-4870-9bca-a518b5931900\r\nCorrelation ID: 1e8372d0-c1ba-4070-88d7-597e9cb5cb2c\r\nTimestamp: 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\"}"

Here the code

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);
}
});
}

I have no idea about azure login without front end. I want to login in azure and upload file to share point in scheduler app in node.

First i need to login by using client id and secret. then i got bearer token. then i want to get access token by using bearer token. At that time i get error like this.

AADSTS50058: A silent sign-in request was sent but no user is signed in

1
Do you have any other concerns regarding this? If my answer is helpful, please accept it as answer( click on the check mark beside the answer to toggle it from greyed out to filled in). Thank you.Tony Ju

1 Answers

0
votes

Why don't you get the access token this way(client credentials flow)?

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);
    }
  }
});

If you need the access token which contains login user message, you can use ROPC flow.

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);
    }
  }
});