NodeJS OpenID连接身份验证请求

时间:2014-07-01 14:26:08

标签: node.js oauth-2.0 openid

我正按照http://openid.net/specs/openid-connect-core-1_0.html尝试实施OpenID-Connect。 我被困在第3.1.2.1节 它表示客户端必须通过GET或POST发送身份验证请求。 我在节点中尝试过。

这是我的index.js(客户:依赖方)

var express = require('express');
var router = express.Router();
var querystring = require('querystring');
var http = require('http');

var id_token = {
    iss : true,
    sub : true,
    aud : true,
    exp : true,
    iat : true,
    auth_time : false,
    nonce : false,
    acr : false,
    amr : false,
    azp : false
};

var auth_request = {
    scope : true,
    response_type : true,
    client_id : true,
    redirect_uri : true,
    state : true,
    response_mode : false,
    nonce : false,
    display : false,
    prompt : false,
    max_age : false,
    ui_locales : false,
    id_token_hint : false,
    login_hint : false,
    acr_values : false
};

/* GET home page. */
router.get('/', function(req, res) {
  res.render('index', { title: 'Express' });
});

router.post('/', function(req, res) {
    var formcontent = req.body;
    if (formcontent.hasOwnProperty("oauth-request")){
        var oauthrequest = querystring.stringify(auth_request);
        var options = {
            host: 'localhost',
            port: 3000,
            path: '/users',
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
                'Content-Length': oauthrequest.length
            }
        };

        var req = http.request(options, function(response){
            response.setEncoding('utf8');
            var str = ''
            response.on('data', function (chunk) {
                str += chunk;
            });

            response.on('end', function () {
                console.log(str);

            });
        });
        req.write(oauthrequest);
        req.end();  
    }
});

module.exports = router;

以下是我的用户代码:(身份验证服务器)

var express = require('express');
var router = express.Router();

/* GET users listing. */
router.get('/', function(req, res) {
  res.send('respond with a resource');
});
router.post('/', function(req, res) {
    //console.log(req.body);    
    res.writeHead(200, {"Content-Type": "text/html"}); 
    res.write( 
        "<!DOCTYPE html>" + 
        "<html lang='en' dir='ltr'>" + 
            "<head>" + 
                "<meta charset='utf-8'>" + 
                "<title>Hola Mundo</title>" + 
            "</head>" + 
            "<body>" + 
                "<script type='text/javascript'>alert('Hello World')</script>" + 
            "</body>" + 
            "</html>"); 
    res.end(); 
    //res.send(req.body);
});

module.exports = router;

正如3.1.2.1节中提到的那样,认证请求的范围属性可以是弹出窗口,所以我假设认证应该能够打开弹出窗口,要求用户登录。但是我无法在Authentication Server端打开弹出窗口。 有人可以通过打开一个弹出窗口来帮助我编写代码,该弹出窗口要求在服务器端登录用户或检查用户是否已经登录?

1 个答案:

答案 0 :(得分:1)

它出现了很多缺失部分:令牌端点等。您可能需要查看passport

查看任何实现(在提供商下)(特别是这个实现OIDC:https://github.com/auth0/passport-auth0,但可能还有其他实现)。

然后可以使用oauthorize toolkit实现(authz)服务器端。