Как отправить токен обновления для нового токена доступа в Microsoft Graph (Passport-Azure-AD OIDCStrategy) - PullRequest
0 голосов
/ 15 ноября 2018

У меня проблемы с пониманием, как отправить обратно токен обновления, чтобы получить новый токен доступа.

Я посмотрел эту документацию: https://developer.microsoft.com/en-us/graph/docs/concepts/nodejs, и мне в основном нужна помощь с Authenticate User- step4, но они, похоже, не вдавались в подробности.

Я пыталсяиспользуя passport-oauth2-refresh, но я думаю, что из-за того, что я использую Azure AD, я получал сообщение об ошибке: «Невозможно зарегистрироваться: не стратегия OAuth2».Поэтому я решил вместо этого вручную проверить срок действия.

Я могу получить токен обновления (POST / token с req.user.refreshToken) вместе с токеном доступа и сохраняю его в jsonно я не знаю, как отправить его обратно.

Вот мой index.js:

const express = require('express');
 const router = express.Router();
 const graphHelper = require('../utils/graphHelper.js');
 const passport = require('passport');
 const request = require('request');
 const SERVER = process.env.SERVER;

 let user_id = null;


 router.get('/', (req, res) => {
  if (!req.isAuthenticated()) {
    res.render('login');
 } else {
    renderBotPage(req, res);
  }
});


 router.get('/login',
  passport.authenticate('azuread-openidconnect', {failureRedirect: '/'}),
  (req, res) => {
    res.redirect('/');
 });


router.get('/token',
  function (req, res, next) {
    passport.authenticate('azuread-openidconnect',
        {
            response: res,                      // required
            failureRedirect: '/'
        }
    )
},
function (req, res) {
    const options = {
        headers: {
            'content-type' : 'application/json'
        },
        method: 'POST',
        url: SERVER,
        json: {
            'accessToken': req.user.accessToken,
            'refreshToken': req.user.refreshToken
        }
    };
    request(options,
        function (error, response, body) {
            if (!error && response.statusCode === 200) {
                console.log(body)
            }
        }
    );
    console.log('We received a return from AzureAD get token.');
    res.redirect('/');

});


 router.post('/token',
   function (req, res, next) {
    passport.authenticate('azuread-openidconnect',
        {
            response: res,                      // required
            failureRedirect: '/'
        }
    )(req, res, next);
},

function (req, res) {
    console.log('res after first token function', res);
    const options = {
        headers: {
            'content-type' : 'application/json'
        },
        method: 'POST',
        url: SERVER,
        json: {
            'accessToken': req.user.accessToken,
            'refreshToken': req.user.refreshToken
        }
    };
    request(options,
        function (error, response, body) {
            if (!error && response.statusCode === 200) {
                console.log(body)
            }
        }
    );
    res.redirect('/');
  });

 function renderBotPage(req, res) {
   graphHelper.getUserData(req.user.accessToken, (err, user) => {

    if (!err) {
        res.render('chatbotOn', {
            display_name: user.body.displayName,
            user_id:user.body.id
        });
    } else {
        // Catch of Expired token error
        if (hasAccessTokenExpired(err)) {

            req.session.destroy(() => {
                req.logOut();
                res.clearCookie('graphNodeCookie');
                res.status(200);
                res.redirect('/');
            });
        }
        renderError(err, res);
        res.render('chatbotOn', {
            display_name: "Random User"
        });
    }
  });
 }

 router.get('/disconnect', (req, res) => {
   req.session.destroy(() => {
     req.logOut();
     res.clearCookie('graphNodeCookie');
     res.status(200);
     res.redirect('/');
   });
 });


 function hasAccessTokenExpired(e) {
  let expired;

  if (!e.innerError) {
    expired = false;
  } else {
    expired = e.forbidden &&
        e.message === 'InvalidAuthenticationToken' &&
        e.response.error.message === "Le token d'accès a expiré.";
  }
  return expired;
 }

 function renderError(e, res) {
  e.innerError = (e.response) ? e.response.text : '';
  res.render('error', {
    error: e
  });
 }

 module.exports = router;

Мой app.js

 const callback = (iss, sub, profile, accessToken, refreshToken, done) => {
 done(null, {
  profile,
  accessToken,
  refreshToken
 });
};

 passport.use(new OIDCStrategy(config.creds, callback));

А вотмой graphHelper.js:

  const request = require('superagent');
   function getUserData(accessToken, callback) {
   request
   .get('https://graph.microsoft.com/beta/me')
   .set('Authorization', 'Bearer ' + accessToken)
   .end((err, res) => {
     callback(err, res);
   });
  }
  exports.getUserData = getUserData;

вот мой config.js:

 module.exports = {
 creds: {
    redirectUrl: 'http://localhost:3000/token',
     clientID: 'xxxxx', // regular
    clientSecret: 'xxxxx', // regular
    identityMetadata: 
   'xxxxxx',
    allowHttpForRedirectUrl: true, // For development only
    responseType: 'code id_token',
    validateIssuer: false, // For development only
    responseMode: 'form_post',
    scope: ['openid', 'offline_access', 'Contacts.Read', 
    'Calendars.ReadWrite'
    ]

    }, 
    };
...