2015-09-19 52 views
0

我正在使用IBM Bluemix平台,并试图在超级基本节点JS应用程序的顶部添加SSO登录页面作为安全性。我本指南来过这里以下:https://www.ng.bluemix.net/docs/services/SingleSignOn/index-gentopic2.html#task_configuringappBluemix上的Node.JS - 附加SSO失败

但是,我得到的是一个错误:“不能GET /”

这是我的app.js代码:

var express = require('express'); 
var passport = require('passport'); 
var cookieParser = require('cookie-parser'); 
var session = require('express-session'); 
var cfenv = require('cfenv'); 

//create a new express server 
var app = express(); 

// SSO 

app.use(cookieParser()); 
app.use(session({resave: 'true', saveUninitialized: 'true' , secret: 'keyboard cat'})); 
app.use(passport.initialize()); 
app.use(passport.session()); 

passport.serializeUser(function(user, done) { 
    done(null, user); 
}); 

passport.deserializeUser(function(obj, done) { 
    done(null, obj); 
});   

// VCAP_SERVICES contains all the credentials of services bound to 
// this application. For details of its content, please refer to 
// the document or sample of each service. 
var services = JSON.parse(process.env.VCAP_SERVICES || "{}"); 
var ssoConfig = services.SingleSignOn[0]; 
var client_id = ssoConfig.credentials.clientId; 
var client_secret = ssoConfig.credentials.secret; 
var authorization_url = ssoConfig.credentials.authorizationEndpointUrl; 
var token_url = ssoConfig.credentials.tokenEndpointUrl; 
var issuer_id = ssoConfig.credentials.issuerIdentifier; 
var callback_url = 'https://sso-test-6.mybluemix.net/auth/sso/callback';   

var OpenIDConnectStrategy = require('passport-idaas-openidconnect').IDaaSOIDCStrategy; 
var Strategy = new OpenIDConnectStrategy({ 
       authorizationURL : authorization_url, 
       tokenURL : token_url, 
       clientID : client_id, 
       scope: 'openid', 
       response_type: 'code', 
       clientSecret : client_secret, 
       callbackURL : callback_url, 
       skipUserProfile: true, 
       issuer: issuer_id}, 
    function(iss, sub, profile, accessToken, refreshToken, params, done) { 
       process.nextTick(function() { 
     profile.accessToken = accessToken; 
     profile.refreshToken = refreshToken; 
     done(null, profile); 
      }) 
}); 

passport.use(Strategy); 
app.get('/login', passport.authenticate('openidconnect', {})); 

function ensureAuthenticated(req, res, next) { 
    if(!req.isAuthenticated()) { 
       req.session.originalUrl = req.originalUrl; 
     res.redirect('/login'); 
    } else { 
     return next(); 
    } 
} 

app.get('/auth/sso/callback',function(req,res,next) {    
    var redirect_url = req.session.originalUrl;     
    passport.authenticate('openidconnect', { 
      successRedirect: redirect_url,         
      failureRedirect: '/failure',       
})(req,res,next); 
}); 

app.get('/failure', function(req, res) { 
    res.send('login failed'); }); 

//get the app environment from Cloud Foundry 
var appEnv = cfenv.getAppEnv(); 

// start server on the specified port and binding host 
app.listen(appEnv.port, function() { 

    // print a message when the server starts listening 
    console.log("server starting on " + appEnv.url); 
}); 

我感觉就像我在做一件非常愚蠢的事情?但我无法弄清楚 -

+0

它看起来像你不必为“/”定义的路由。如果你尝试去“/登录”会发生什么? – grill

+0

你可以在这里添加日志文件吗?您可以通过cf 原木获得--recent –

回答

0

您需要定义路由'/',然后重定向用户登录。

例如:

app.get('/', function(req, res) { 
     res.send('Single Sign On <a href="/login">Login</a>\n'); 
    }); 

你可以看到在下面的链接一个很好的例子:

http://www.ibm.com/developerworks/library/se-bluemix-single-sign-on-app/index.html#N1040F

+0

您是明星!我现在获取“登录”文本,因此我看到SSO默认登录页面。 然而,当我登录(正确)我得到: 类型错误:无法设置属性为/家/ VCAP的不确定 '用户'/应用/ node_modules /护照IDAAS-openidconnect/node_modules /护照/ lib中/ HTTP /序列化(/ home/vcap/app/node_modules/passport/lib/authenticator)时传递(/home/vcap/app/node_modules/passport/lib/authenticator.js:267:43) 的.js:276:7) 在/home/vcap/app/app.js:18:4 在通(/home/vcap/app/node_modules/passport/lib/authenticator.js:284:9) +还有几行:-( – Petar

+1

如果没有看到更多的当前代码,则无法确定,但是您可能会遇到https://github.com/jaredhanson/passport/issues/400中记录的问题。如果y您正在使用最新的“护照”模块,您可能需要使用“护照 - 策略”模块。有关更多信息,请参阅GitHub问题。 – jimmc

+0

我能够重新创建问题。我没有尝试护照战略,但搬到护照0.2.2为我工作。我可以稍后用护照策略尝试,并让你知道。 –