如何在Bluemix上使用node.js应用程序的单点登录

如何在Bluemix上使用node.js应用程序的单点登录,node.js,single-sign-on,ibm-cloud,Node.js,Single Sign On,Ibm Cloud,我不明白问题出在哪里。我学习了一些教程和SSO文档。我总是有同样的问题:我的应用程序无法启动。我的应用程序和我的服务有很好的界限 cf push 以下是错误: 然后,当我使用cf日志时: cf logs sso-8 回复图片: 这是我现在的代码: //package.json { "name": "NodejsStarterApp", "version": "0.0.1", "description": "Insert description here", "private": true

我不明白问题出在哪里。我学习了一些教程和SSO文档。我总是有同样的问题:我的应用程序无法启动。我的应用程序和我的服务有很好的界限

cf push
以下是错误:

然后,当我使用cf日志时:

cf logs sso-8
回复图片:

这是我现在的代码:

//package.json
{
"name": "NodejsStarterApp",
"version": "0.0.1",
"description": "Insert description here",
"private": true,
"scripts": {
    "start": "node app.js"
},
"dependencies": {
    "express": "latest",
    "passport": "latest",
    "body-parser": "latest",
    "cookie-parser": "latest",
    "express-session": "latest",
    "cfenv": "1.0.x",
    "passport-idaas-openidconnect": "latest"
},
"repository": {},
"engines": {
    "node": "4.x"
} 
}


//app.js
var express = require('express');
var passport = require('passport');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var OpenIDConnectStrategy = require('passport-idaas-openidconnect').IDaaSOIDCStrategy;
var app = express();

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

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

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

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-8.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(accessToken, refreshToken, profile, 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: '/hello',                                
        failureRedirect: '/failure',                        
    })(req,res,next);
});

app.get('/hello', ensureAuthenticated, function(request, response) {
    request.send('Hello, '+ request.user['id'] + '!\n' + '<a href="/logout">Log Out</a>');
});

app.get('/logout', function(req, res){
    req.logout();
    res.redirect('/');
});

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

app.get('/', function (req, res) {
    res.send('<h1>Bluemix Service: Single Sign On</h1>' + '<p>Sign In with a Social Identity Source (SIS): Cloud directory, Facebook, Google+ or LinkedIn.</p>' + '<a href="/auth/sso/callback">Sign In with a SIS</a>');
});

var appport = process.env.VCAP_APP_PORT || 8888;
var host = (process.env.VCAP_APP_HOST || 'localhost');
var server = app.listen(appport, function () {
    var host = server.address().address
    var port = server.address().port
    console.log('Example app listening at http://%s:%s', host, port);
});
//package.json
{
“名称”:“NodejsStarterApp”,
“版本”:“0.0.1”,
“说明”:“在此处插入说明”,
“私人”:没错,
“脚本”:{
“开始”:“node app.js”
},
“依赖项”:{
“快车”:“最新”,
“护照”:“最新”,
“正文分析器”:“最新”,
“cookie解析器”:“最新版本”,
“快速会话”:“最新”,
“cfenv”:“1.0.x”,
“passport idaas openidconnect”:“最新”
},
“存储库”:{},
“发动机”:{
“节点”:“4.x”
} 
}
//app.js
var express=需要(“express”);
var passport=需要(“passport”);
var cookieParser=require('cookie-parser');
var会话=需要(“快速会话”);
var OpenIDConnectStrategy=require('passport-idaas-openidconnect')。IDaaSOIDCStrategy;
var-app=express();
使用(cookieParser());
使用(会话({secret:'keyboard cat',resave:false,saveUninitialized:true});
app.use(passport.initialize());
app.use(passport.session());
passport.user(函数(user,done){
完成(空,用户);
});
passport.deserializeUser(函数(obj,done){
完成(空,obj);
});
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\u url='1https://sso-8.mybluemix.net/auth/sso/callback';
var OpenIDConnectStrategy=require('passport-idaas-openidconnect')。IDaaSOIDCStrategy;
var策略=新的OpenIDConnectStrategy({
授权url:authorization\u url,
tokenURL:token_url,
clientID:客户端id,
作用域:“openid”,
响应类型:“代码”,
clientSecret:client_secret,
callbackURL:callback\u url,
skipUserProfile:没错,
发卡机构:发卡机构id
},函数(accessToken、refreshToken、配置文件、完成){
process.nextTick(函数(){
profile.accessToken=accessToken;
profile.refreshttoken=refreshttoken;
完成(空,配置文件);
});
});
护照使用(策略);
app.get('/login',passport.authenticate('openidconnect',{}));
功能确保重新验证(req、res、next){
如果(!req.isAuthenticated()){
req.session.originalUrl=req.originalUrl;
res.redirect('/login');
}否则{
返回next();
}
}
app.get('/auth/sso/callback',函数(req,res,next){
var redirect_url=req.session.originalUrl;
passport.authenticate('openidconnect'{
successRedirect:“/hello”,
failureRedirect:“/failure”,
})(req、res、next);
});
app.get('/hello',ensureAuthenticated,函数(请求,响应){
request.send('Hello',+request.user['id']+'!\n'+');
});
app.get('/logout',函数(req,res){
请求注销();
res.redirect('/');
});
app.get('/failure',函数(req,res){
res.send('登录失败');
});
app.get('/',函数(req,res){
res.send('Bluemix服务:单点登录'+'使用社交身份源(SIS)登录:云目录、Facebook、Google+或LinkedIn。

'+''; }); var appport=process.env.VCAP_APP|u PORT | 8888; var host=(process.env.VCAP_APP_host | | |'localhost'); var server=app.listen(appport,函数(){ var host=server.address().address var port=server.address().port console.log('示例应用程序在http://%s:%s、主机、端口侦听); });
在将SSO服务绑定到应用程序之前,需要先将该应用程序推送到Bluemix并运行

将应用程序推送至Bluemix并进行阶段性展示 然后需要将SSO服务创建为未绑定,
完全创建和配置SSO服务后,您可以将其绑定到应用程序。

谢谢。SSO服务的文档按此顺序提到以下步骤:1。创建应用程序和服务2。把它们捆起来。修改应用程序4。推送应用程序这是我做的,应用程序没有启动。然而,我发现我的错误来自哪里!实际上,模块的版本:“passport idaas openidconnect”:“latest”不应该是“latest”,而应该是“2.0.0”。我改了,现在可以用了。再次感谢:)