关于node.js:具有Simple-OAuth2和客户端凭据流的Microsoft Graph API

Microsoft Graph API with Simple-OAuth2 and Client Credentials Flow

我正在尝试在NodeJS网站中使用Simple-OAuth2登录具有客户端凭据流的用户。

我的路线/index.js是这样的:

1
2
3
4
5
6
7
8
9
10
11
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是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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: '[email protected]',
  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错误:

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

这个错误对我来说意义不大,因为代码是由simple-oauth2提供的。

有人可以阐明我的实际错误吗?


那么您必须将代码包装到async函数中,以便可以在该函数中使用await关键字。您可以在此处找到更多信息。

在您的情况下,我会将代码包装到函数中并按如下所示导出该函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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: '[email protected]',
  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;

然后您可以像这样使用该功能:

1
2
3
4
5
6
7
8
9
10
11
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;