Microsoft Graph API с потоком Simple-OAuth2 и учетных данных клиента

#node.js #oauth-2.0 #microsoft-graph-api

#node.js #oauth-2.0 #microsoft-graph-api

Вопрос:

Я пытаюсь регистрировать пользователей с потоком учетных данных клиента с помощью Simple-OAuth2 на веб-сайте NodeJS.

Мой routes/index.js это:

 var express = require('express');
var router = express.Router();
var authHelper = require('../helpers/auth');

router.get('/', async function(req, res, next) {
  let parms = { title: 'Home', active: { home: true } };
  const accessToken = await authHelper.accessToken;
  res.render('index', parms);
});

module.exports = router;
  

И мой auth.js это:

 const credentials = {
  client: {
    id: process.env.APP_ID,
    secret: process.env.APP_PASSWORD,
  },
  auth: {
    tokenHost: 'https://login.microsoftonline.com',
    authorizePath: "common/oauth2/v2.0/authorize",
    tokenPath: "common/oauth2/v2.0/token",
  }
};
const oauth2 = require('simple-oauth2').create(credentials);

const tokenConfig = {
  username: 'uuuuuu@dddddd.com',
  password: 'ppppppp',
  scope: process.env.APP_SCOPES,
};

try {
  const result = await oauth2.ownerPassword.getToken(tokenConfig);
  const accessToken = oauth2.accessToken.create(result);
} catch (error) {
  console.log('Access Token Error', error.message);
}
exports.accessToken = accessToken;
  

Когда я пытаюсь запустить веб-сайт, nodejs показывает мне ошибку sintax:

 const result = await oauth2.ownerPassword.getToken(tokenConfig);
               ^^^^^
SyntaxError: await is only valid in async function
  

Эта ошибка не имеет для меня особого смысла, поскольку код предоставляется simple-oauth2.

Может ли кто-нибудь пролить свет на мою фактическую ошибку?

Ответ №1:

Ну, вы должны обернуть свой код в async функцию, чтобы вы могли использовать await ключевое слово в этой функции. Вы можете найти более подробную информацию здесь.

В вашем случае я бы преобразовал код в функцию и экспортировал эту функцию следующим образом:

 const credentials = {
  client: {
    id: process.env.APP_ID,
    secret: process.env.APP_PASSWORD,
  },
  auth: {
    tokenHost: 'https://login.microsoftonline.com',
    authorizePath: "common/oauth2/v2.0/authorize",
    tokenPath: "common/oauth2/v2.0/token",
  }
};
const oauth2 = require('simple-oauth2').create(credentials);

const tokenConfig = {
  username: 'uuuuuu@dddddd.com',
  password: 'ppppppp',
  scope: process.env.APP_SCOPES,
};

const getAccessToken = async () => {
  try {
    const result = await oauth2.ownerPassword.getToken(tokenConfig);
    const accessToken = oauth2.accessToken.create(result);
    return accessToken;
  } catch (error) {
    console.log('Access Token Error', error.message);
    return null;
  }
};

exports.getAccessToken = getAccessToken;
  

И затем вы можете использовать эту функцию следующим образом:

 var express = require('express');
var router = express.Router();
var authHelper = require('../helpers/auth');

router.get('/', async function(req, res, next) {
  let parms = { title: 'Home', active: { home: true } };
  const accessToken = await authHelper.getAccessToken();
  res.render('index', parms);
});

module.exports = router;