2016-09-20 3 views
0

Вот ошибка, которую я продолжаю получать «CWOAU0062E: поставщик услуг OAuth не смог перенаправить запрос, потому что URI перенаправления был недействителен. Обратитесь к системному администратору, чтобы решить проблему».Не удалось получить SSO для NodeJS в BlueMix

var express = require('express'); 

// Add for SSO 
var cookieParser = require('cookie-parser'); 
var session = require('express-session'); 
var passport = require('passport'); 
var OpenIDConnectStrategy = require('passport-idaas-openidconnect').IDaaSOIDCStrategy; 
var redis = require('redis'); 
var RedisStore = require('connect-redis')(session); 

// cfenv provides access to your Cloud Foundry environment 
// for more info, see: https://www.npmjs.com/package/cfenv 
var cfenv = require('cfenv'); 
// get the app environment from Cloud Foundry 
var appEnv = cfenv.getAppEnv(); 

// create a new express server 
var app = express(); 
var services = JSON.parse(process.env.VCAP_SERVICES || null); 
// get configuration for redis backing service and connect to service 
var redisConfig = appEnv.getService(/Redis.*/); 
if(redisConfig == null) { 
    console.log('ERROR: Failed to create REDDISCONFIG!!!'); 
} else { 
    var redisPort = redisConfig.credentials.port; 
    var redisHost = redisConfig.credentials.hostname; 
    var redisPasswd = redisConfig.credentials.password; 

    var redisclient = redis.createClient(redisPort, redisHost, {no_ready_check: true}); 
    redisclient.auth(redisPasswd, function (err) { 
     if (err) { 
     throw err; 
     } 
    }); 

    redisclient.on('connect', function() { 
     console.log('Connected to Redis'); 
    }); 
} 

// define express session services, etc for SSO 
app.use(cookieParser()); 
// app.use(session({resave: 'true', saveUninitialized: 'true' , secret: 'keyboard cat'})); 
if(redisConfig != null) { 
    app.use(session({ 
    store: new RedisStore({ client: redisclient }), 
    resave: 'true', 
    saveUninitialized: 'true', 
    secret: 'top secr8t' 
    })); 
} 

app.use(passport.initialize()); 
app.use(passport.session()); 

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

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

// find config object for the SSO services from VCAP_SERVICES through cfenv/appEnv 
var ssoConfig = services.SingleSignOn[0]; 
//appEnv.getService(/Single Sign On.*/) 
if(ssoConfig == null) { 
    console.log('ERROR: Failed to instantiate SSOCONFIG. Its not available!!!'); 
} else { 
    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; 
} 
// you MUST change the host route to match your application name 
// var callback_url = 'https://scaleSSO-TOR0815.mybluemix.net/auth/sso/callback'; 
var callback_url = 'https://krishnodejs.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 : appEnv.url + '/auth/sso/callback', 
       // 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 = 'https://krishnodejs.mybluemix.net'; 
     res.redirect('/login'); 
    } else { 
     return next(); 
    } 
} 

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


app.get('/hello', ensureAuthenticated, function(req, res) { 
    res.send('Hello, '+ req.user['id'] + '!'); } 
); 

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

// serve the files out of ./public as our main files 
app.use(express.static(__dirname + '/public')); 

// 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); 
}); 

У меня есть следующий URL в настройках возврата URL в SSO «https://krishnodejs.mybluemix.net/hello»

Любые советы предложение исправить более чем приветствуется.

Перенаправление URL, которая не имеет свой обратный вызов URL право, за странный & области видимости = .... кроме OpenID, но я думаю, что не может быть проблемой

Я посмотрел на на стороне сервера журналы для ошибок. Но их не было. Не оставляет мне никакого ключа к, где проблема

«https://ssotest-gx1592z76o-cl12.iam.ibmcloud.com/idaas/oidc/endpoint/default/authorize?response_type=code&client_id=EdzctxPuQ4&redirect_uri=https://krishnodejs.mybluemix.net/auth/sso/callback&scope=openid Вконтакте»

ответ

0

Для людей, которые имеют схожие проблемы, следить за параметром REDIRECT_URL, который возвращается из BlueMix при входе в систему.

В моем случае я устанавливал этот URL в 2-х местах

Хотя обе ссылки указывают на один и тот же URL-адрес, по какой-то причине приложение выбирает код из кода. То, как я смог понять это, было из того, что возвращалось в параметр callback_url (как указано выше) Во-первых, URL-адрес перенаправления, который мы предоставляем в коде, не обязательно должен быть полным URL-адресом. В моем случае это должен был быть «bluemix/callback». Я это исправил. Это сработало, нет. Но вещи перешли от одной проблемы к другой. Один шаг вперед, если можно так сказать. Какова была следующая проблема? URL возвращался вправо, но протокол не был. Вместо https всегда возвращался http, поэтому страница все еще не загружалась. Наконец, я избавился от установки этого URL-кода из кода и извлечения всего материала из URL-адреса в пользовательском интерфейсе. Я установил URL-адрес в «Настроить приложение» на «https://krishnodejs.mybluemix.net/auth/bluemix/callback». Если вам интересно, что мой код выглядел, после этих изменений, здесь вы идете

var OpenIDConnectStrategy = require('passport-idaas-openidconnect').IDaaSOIDCStrategy; 
var OpenIDStrategy = 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(OpenIDStrategy); 

}

Как вы можете видеть, что я закомментировать код, который проходит callback_url. Бинго, все сработало. Полученный урок: смотрите «redirect_url». Если URL-адрес ошибочен, вам не удастся установить его правильно, либо в коде, либо в интерфейсе пользователя. Моя следующая попытка заключается в том, чтобы не устанавливать его вообще в пользовательском интерфейсе и полностью отключать его от кода. На данный момент я думал, что пропущу эту проблему, и я могу двигаться дальше. Надеюсь, это поможет.

0

CWOAU0062E: Поставщик услуг OAuth не смог перенаправить запрос, поскольку URI перенаправления был недопустимым. Чтобы устранить проблему, обратитесь к системному администратору. обычно указывает, что в URL-адресе Return-to неправильно настроен в службе единого входа.

Поэтому, пожалуйста, обновите URL-адрес Single Sign On в разделе Integrate службы, чтобы он соответствовал callback_url в вашем коде, а затем перезапустил приложение