Javascript nodej.js中的模块passport-oauth2:授权请求中包含的额外参数

Javascript nodej.js中的模块passport-oauth2:授权请求中包含的额外参数,javascript,node.js,oauth-2.0,Javascript,Node.js,Oauth 2.0,我在node.js应用程序中实现Oauth2身份验证时遇到了一个问题,我需要在授权请求中添加一个额外的参数,但模块只是忽略未知参数 我的代码附在下面。被忽略的参数是APIName 我知道APIName被忽略的原因是我在浏览器中看到URL: https://api.ihealthlabs.com:8443/OpenApiV2/OAuthv2/userauthorization/?response_type=code&redirect_uri=SOMEREDIRECTURI&clie

我在node.js应用程序中实现Oauth2身份验证时遇到了一个问题,我需要在授权请求中添加一个额外的参数,但模块只是忽略未知参数

我的代码附在下面。被忽略的参数是APIName

我知道APIName被忽略的原因是我在浏览器中看到URL:

https://api.ihealthlabs.com:8443/OpenApiV2/OAuthv2/userauthorization/?response_type=code&redirect_uri=SOMEREDIRECTURI&client_id=SOMECLIENTID
我想知道如何在授权请求中添加额外的参数?可能通过覆盖节点_modules/passport_oauth2/lib/strategy.js中的函数OAuth2Strategy.prototype.authorizationParams,在加载的文件中如下所示:

/**
 * Return extra parameters to be included in the authorization request.
 *
 * Some OAuth 2.0 providers allow additional, non-standard parameters to be
 * included when requesting authorization.  Since these parameters are not
 * standardized by the OAuth 2.0 specification, OAuth 2.0-based authentication
 * strategies can overrride this function in order to populate these parameters
 * as required by the provider.
 *
 * @param {Object} options
 * @return {Object}
 * @api protected
 */
OAuth2Strategy.prototype.authorizationParams = function(options) {
  return {};
};

在这段时间里,我设法找到了一个解决办法。也许它会帮助有类似问题的人

对于解决方案,我没有使用众所周知的模块,如passport-oauth2或simple-oauth2,而只是使用模块querystring来构建请求URL和模块请求来进行HTTP调用

例如:

var express = require('express');
var router = express.Router();
var request = require('request');
var qs = require('querystring');
var configAuth = require('../config/auth');

var authorization_url_site = configAuth.iHealthAuth.authorizationSite;
var authorization_url_params = {
    response_type : 'code',
    client_id: configAuth.iHealthAuth.clientID,
    redirect_uri: configAuth.iHealthAuth.callbackURL,
    APIName : configAuth.iHealthAuth.APIName
};
var authorization_uri = authorization_url_site + '?' + qs.stringify(authorization_url_params);

var token_url_site = configAuth.iHealthAuth.tokenSite;
var token_url_params = {
    grant_type : 'authorization_code',
    client_id: configAuth.iHealthAuth.clientID,
    client_secret: configAuth.iHealthAuth.clientSecret,
    redirect_uri: configAuth.iHealthAuth.callbackURL,
    code: req.query.code
};
var token_uri = token_url_site + '?' + qs.stringify(token_url_params);

// Initial page redirecting to the login page
router.route('/auth')
    .get(function (req, res) {
            res.redirect(authorization_uri);
    });

// Callback service parsing the authorization token and asking for the access token
router.route('/')
    .get(function(req, res) {

        request(token_uri, function(err, response, body) {
                if(err) {
                    throw err;
                } else {
                    var data = JSON.parse(body);
                    // save token to database or file
                    saveToken(data);
                }
            });
        });
    });

module.exports = router;
您可以覆盖OAuth2Strategy.prototype.authorizationParams,如下所示

 var myStrategy = new OAuth2Strategy({
        authorizationURL: 'https://api.ihealthlabs.com:8443/OpenApiV2/OAuthv2/userauthorization/',
        tokenURL: 'https://api.ihealthlabs.com:8443/OpenApiV2/OAuthv2/userauthorization/',
        clientID: configAuth.iHealthAuth.clientID,
        clientSecret: configAuth.iHealthAuth.clientSecret,
        callbackURL: configAuth.iHealthAuth.callbackURL
    },
    function(token, refreshToken, profile, done) {
        // ...
    });

    myStrategy.authorizationParams = function(options) {
      return {
        APIName : 'OpenApiActivity'
      };
    };

    passport.use('ihealth',myStrategy);
对于Microsoft ADFS OAuth 2,可以使用此选项添加所需的源参数;如果希望回调也包含某些特定值,则添加state参数

调用passport.authenticate时,可以设置functionoptions中的选项:


我觉得你最初的问题已经得到了巴拉菲的回答。你愿意接受他们的回答吗?当你问你的问题时,你是如此接近!
 var myStrategy = new OAuth2Strategy({
        authorizationURL: 'https://api.ihealthlabs.com:8443/OpenApiV2/OAuthv2/userauthorization/',
        tokenURL: 'https://api.ihealthlabs.com:8443/OpenApiV2/OAuthv2/userauthorization/',
        clientID: configAuth.iHealthAuth.clientID,
        clientSecret: configAuth.iHealthAuth.clientSecret,
        callbackURL: configAuth.iHealthAuth.callbackURL
    },
    function(token, refreshToken, profile, done) {
        // ...
    });

    myStrategy.authorizationParams = function(options) {
      return {
        APIName : 'OpenApiActivity'
      };
    };

    passport.use('ihealth',myStrategy);
router.get('/auth', passport.authenticate('ihealth', {time: Date.now()}));