当前位置: 首页 > 知识库问答 >
问题:

Bluemix SSO节点。JS:社交媒体认证

邵骁
2023-03-14

Bluemix;节点。js;SSO;CWOA0062E

此时的URL是:https://mzsso-yyyyyyyyyyyy.iam.ibmcloud.com/idaas/oidc/endpoint/default/authorize?response_type=code

(请注意,xxxxx、yyyy、zzzzz等是我的屏蔽私有标识符。。。

1)错误消息:CWOAU0062E:OAuth服务提供商无法重定向请求,因为重定向URI无效。请联系您的系统管理员以解决问题。这发生在我点击我的 /loginurl后...

2)在我的Bluemix门户中没有“集成”,但我正在使用“新Bluemix门户”

3)谷歌测试,并使用Bluemix

中的验证按钮验证ok 4)Facebook测试,并使用Bluemix

5)我在线探索的所有示例和支持似乎都是1年前的,我的所有代码组合/变体都会导致相同的错误消息

6)它是否适用于本地测试(注意本地开发缺少https)(我需要添加“localhost:3000”吗google中的重定向问题?

6a)本地运行不支持https,这会影响出于开发目的在本地运行的任何能力吗?

6b)目前我需要经常推送我的应用程序,因为我的不确定性和SSO的一般问题。我对尝试在本地测试它失去了信心,因为它在准系统项目的服务器上失败了。

7)术语“回调url”和“重定向url”(来自google、Bluemix和callback_url的上下文)之间有区别吗?

8)我的代码没有直接引用“google”或“facebook”。我忘记了一些显而易见的事情,或者Bluemix SSO背后的想法是让我的应用程序提供商不可知论?

var express = require('express');

var app = express();
var mzSession = require('express-session');

var passport = require('passport');
var cookieParser = require('cookie-parser');
var OpenIDConnectStrategy = require('passport-idaas-openidconnect').IDaaSOIDCStrategy;

app.use(mzSession({
    secret : 'mzSSOSource',
    resave : false,
    saveUninitialized : true
}));

app.use(cookieParser());

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 cfenv = require("cfenv");
var appEnv = cfenv.getAppEnv();
var appServices = appEnv.getServices();

var SSOList = appServices;

if (SSOList.SingleSignOn === undefined) {
    SSOList = {
        "SingleSignOn" : [ {
            "credentials" : {
                "secret" : "xxxxxxxxxx",
                "tokenEndpointUrl" : "https://mzsso-yyyyyyyyyyyy.iam.ibmcloud.com/idaas/oidc/endpoint/default/token",
                "authorizationEndpointUrl" : "https://mzsso-yyyyyyyyyy.iam.ibmcloud.com/idaas/oidc/endpoint/default/authorize",
                "issuerIdentifier" : "yyyyyyyyyy.iam.ibmcloud.com",
                "clientId" : "zzzzzzzzzz",
                "serverSupportedScope" : [ "openid" ]
            },
            "syslog_drain_url" : null,
            "label" : "SingleSignOn",
            "provider" : null,
            "plan" : "professional",
            "name" : "mzSSO",
            "tags" : [ "security", "ibm_created", "ibm_dedicated_public" ]
        } ]
    };
}

var SSOEntryCreds = SSOList.SingleSignOn[0].credentials;

var OpenIDConnectStrategy = require('passport-idaas-openidconnect').IDaaSOIDCStrategy;
var Strategy = new OpenIDConnectStrategy({
    authorizationURL : SSOEntryCreds.authorizationEndpointUrl,
    tokenURL : SSOEntryCreds.tokenEndpointUrl,
    clientID : SSOEntryCreds.clientId,
    scope : 'openid',
    response_type : 'code',
    clientSecret : SSOEntryCreds.secret,
    callbackURL : 'https://mzibmsso.mybluemix.net/auth/sso/callback',
    skipUserProfile : true,
    issuer : SSOEntryCreds.issuerIdentifier
}, 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;
    console.log(redirect_url);
    passport.authenticate('openidconnect', {
        successRedirect : redirect_url,
        failureRedirect : '/failure',
    })(req, res, next);
});

app.get('/hello', ensureAuthenticated, function(request, response) {
    response.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('<a href="/auth/sso/callback">Sign In with a SIS</a>');
});

app.listen(appEnv.port, appEnv.bind, function() {
    console.log('Server listening: ' + JSON.stringify({
        'url' : appEnv.url,
        'bind' : appEnv.bind,
        'port' : appEnv.port
    }));
});
console.log('Server Script Completed');

共有1个答案

公羊玉泽
2023-03-14

回调URL很可能与应用程序配置的返回URL中设置的内容不匹配。参考此答案:https://developer.ibm.com/answers/questions/175319/why-sso-can-not-work.html

对于您的问题#1-“集成”面板仅在应用程序仪表板的上下文中可用。登录Bluemix后,您需要单击应用程序的SSO服务图标,而不是SSO服务本身。

对于#7,callback_url的值和返回URL(来自应用程序仪表板)应该是相同的。返回URL将成为该链接的redirect_uri发布的https://mzsso-yyyyyyyyyyyy.iam.ibmcloud.com/idaas/oidc/endpoint/default/authorize?response_type=code

 类似资料:
  • 因此,我想创建一种社交媒体应用程序,并使用fiRest作为主数据库。 目标是创建“facebook”新闻源。 每个用户都有一个朋友列表,每个用户都可以创建帖子。 每个帖子都可以被修改为对应用程序的所有用户或用户朋友可见。所以每个用户都可以向他所有的朋友发布帖子,并向应用程序中的每个人发布帖子。 此外,用户还可以在新闻提要中“保存”他们喜欢的帖子。(类似帖子子集合) 现在在用户的新闻提要中-我如何查

  • 我有一个集合,我的应用程序在其中存储用户的所有帖子,数据结构如下: 现在,我想向我的用户显示这个集合的所有帖子;但是,只有当用户跟随创建帖子的人时,即帖子文档的字段适合。 我知道如果用户只关注一个人,查询集合是很简单的,也就是说,我有一个简单的子句。但是:如果我的用户关注10,000人或更多人呢?我怎么查询呢? 另外,我应该如何存储,即用户跟随的人?使用简单的数组似乎不适合我,但是使用所有其他选项

  • 考虑instagram提要场景。我想让我关注的人“发布”所有帖子。对于每一个帖子,我都想知道我是否喜欢它,还想知道我关注的其他人中有谁喜欢它(如果有的话)。在gremlin中实现这一点的最佳解决方案是什么(可能避免重复)? 图像清晰 下面只给出了用户2“发布”的帖子。如何在同一查询中获取其他信息?

  • 这可能是一个相当开放的问题,但我需要发布到各种社交媒体网站,如facebook,twitter,领英,谷歌等。现在请记住,这是一个真正的帖子,而不仅仅是一个共享-换句话说,我已经通过OAuth存储了用户凭据,并将在他们的墙上制作一个格式化的帖子,提要等。 问:有没有什么方法可以让我在各种社交媒体上准确或非常接近地预览这篇文章?例如,在用户发布帖子之前,我可以向他们展示他们在facebook或谷歌上

  • 当用户导航到Likes或Comments屏幕时,他/她将分别看到用户指定帖子的Likes或Comments列表。 用这种结构能正确处理这两种情况吗?或者将评论和喜欢集合放在/posts/{userId}/userposts/{postId}/(也可以作为子集合)中会更好 Firestore可以同时执行“多个集合查询”吗?以便在我的“交互”屏幕中,我可以从按日期排序的不同集合中获取所需的数据 我很感

  • 我有一个网站,使用twitter,facebook或google登录系统。我使用oAuth,这是我的代码。 配置 控制器 问题是我如何知道用户使用哪一种社交媒体登录系统?