本教程将向您展示如何启用您的 IBM Bluemix 应用程序来接受用户身份验证,这些用户身份来自流行的社会身份来源,比如 Facebook、Google +、LinkedIn 和使用 Bluemix 单点登录 (SSO) 服务定制的联合身份。Bluemix SSO 服务使用简单的基于策略的配置,提供了将用户身份验证快速添加到 Bluemix 应用程序中的必要机制。
“ 在完成本教程之后,您应该能够将SSO 服务添加到您的 IBM Bluemix 应用程序并进行设置,根据您的需要和用户需求来启用身份来源。 ”
运行应用程序
获取代码
您需要对以下方面有基本的了解:
您还需要:
您还需要有您想要访问的社交网络的帐户,用于进行身份验证。如果您没有这些,可以通过访问各个网站来注册和创建帐户。
要创建在本教程中描述的 SSO 身份验证方案,必须安装和设置以下软件:
本教程中使用的操作系统是 Windows 7,如果您使用的是 Mac 或 Linux 系统,本教程中的图形与和您使用的图形用户界面中的图形之间可能有所不同。除了每个平台的安装过程明显不同,这些图形之间的差异并不明显。
首先,创建一个基本的 Node.js Bluemix 应用程序,如下所示:
javascript 来过滤结果。 项目的结构已发生更改。该项目现在包含 JavaScript 资源、app.js 文件和 package.json 文件。
现在,您已经创建了 Node.js 项目,是时候将应用程序部署到 Bluemix 了。
如果想在将应用程序推送到 Bluemix 后查看正在运行的应用程序,请右键单击相同服务器中的项目,然后单击 Open Home Page 。一个浏览器选项卡将会打开,其中显示了正在运行的应用程序以及消息 Generated Node.js application that runs on IBM Bluemix 。在打开主页后,您可以在 Web 浏览器选项卡的地址栏中看到您的应用程序的 URL 地址。
此时,应用程序已完成部署并正在 Bluemix 上运行。现在,您将创建和设置单点登录服务,并将它绑定到应用程序。
接下来,您会看到 Single Sign On 设置页面,在该页面上,您以选择一个提供商并添加一个或多个可用的身份来源,比如 SAML Enterprise、Cloud Directory 或一些流行的社会身份来源(比如 LinkedIn、Facebook 或 Google+)。
在这个过程中,您将配置 Cloud Directory、LinkedIn、Facebook 和 Google+ 身份来源。
Cloud Directory 身份来源使用了一个托管在云中的注册表。Cloud Directory 托管了身份来源的密码策略和用户信息。
在用户访问某个应用程序之前,必须将他们添加到 Cloud Directory 的注册表中。您需要使用用户的信息来填充该注册表。您还可以配置在用户登录应用程序时使用的密码策略。
SSO 服务已准备好绑定和用于应用程序。不过,在测试它之前,应该先完成剩余的身份来源。
点击查看大图
关闭 [x]
添加 Facebook 的过程非常类似于添加 LinkedIn 的过程。
点击查看大图
关闭 [x]
Facebook SSO 服务现在已经准备就绪,可供使用。
您已经完成了对 SSO 服务的设置。下一步是将应用程序绑定到服务。
/auth/sso/callback 。例如,完整的 URL 应如下所示: http://appname.mybluemix.net/auth/sso/callback 要使用具有 SSO 服务的应用程序,必须对代码执行一些修改。使用上面的 获取代码 按钮来复制 IBM DevOps Services Single Sign On 项目,以便创建您自己的应用程序副本。然后执行以下更改。
将以下依赖关系添加到 package.json 文件:
您的代码现在看起来应该如下所示:
... "description": "Insert description here", "dependencies": { "express": "latest", "passport": "latest", "body-parser": "latest", "cookie-parser": "latest", "express-session": "latest" }, "scripts": { ... 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(); 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 = 'PUT_CALLBACK_URL_HERE'; 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(); } } PUT_CALLBACK_URL_HERE 。插入您的应用程序的回调 URL。 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); }); 在本示例中,在用户成功登录后,他们被重定向到 /hello 页面。
app.get('/hello', ensureAuthenticated, function(request, response) { request.send('Hello, '+ request.user['id'] + '!/n' + '<a href="/logout">Log Out</a>'); }); 前面代码中的 ensureAuthenticated 回调要求经过身份验证的用户使用 SSO 进行登录,但会将所请求的页面显示给经过身份验证的用户。如果用户在访问页面时未经过身份验证,那么他们会并定向到登录页面。如果他们经过了身份验证,则会向他们显示一个页面,该页面中包含消息 Hello, <user_name> (其中的 <user_name> 可以使用请求值中包含的用户名称进行替换)和一个注销链接,该链接会将用户重定向到注销页面,让用户返回到主页。
app.get('/logout', function(req, res){ req.logout(); res.redirect('/'); }); 如果登录失败,用户会被重定向到 /failure 页面,如下面代码所示,一个 Login failed 消息将会显示。
app.get('/failure', function(req, res) { res.send('Login failed'); }); 在前面所示的示例中,如果用户成功登录,那么他们会被定向到 /hello 页面。不过,如果您想将用户定向到最初请求的路径,则必须对代码进行稍微修改。在本示例中,回调被重定向到用户最初请求的页面,在这里,我们使用了属性 req.session.originalUri ,它会将路径存储到最初请求的资源。
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 函数中添加 ensureAuthenticated 回调。 点击查看代码清单
关闭 [x]
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); }); No operations to display at this time 时,工作就完成了。如果 Progress 选项卡不可见,请单击 Window > Show view > Other... > General > Progress 。
hello 页面,它显示了您登录的时候所用的电子邮件地址。 备注:如果您的电子邮件地址没有显示,那么您会在 "Hello," 与 "! Log Out" 之间看到文本。这很正常,可能是因为受欢迎的身份来源的 API 发生了改变,这在 SSO 服务可以承受的范围内。
要测试另一个服务,过程是相同的。
在本教程中,您了解了如何:
现在,您可以在您自己的 Node.js 应用程序上添加和设置 IBM Bluemix SSO 服务。您可以启用一个或多个身份来源,您的用户可以选择他们想要采用哪种登录类型来使用您的应用程序。
您可以下载本教程的源代码,它们托管在 JazzHub 中,您可以根据您的应用程序的需要来修改和适应它。
相关主题: Node.js IBM Eclipse
BLUEMIX SERVICE USED IN THIS TUTORIAL: 单点登录服务 可以帮助您维护针对云开发的 Web 应用程序和移动应用程序的安全,让您轻松地构建和增强应用程序,使之能够提供基于策略的用户访问安全性。