在onelogin中使用OpenId Connect Authentication Flow

简介

onelogin是一个优秀的SSO(Single Sign-On)服务提供商,我们可以借助onelogin的服务,轻松构建SSO程序。

之前我们也讲过了,构建SSO的通用协议一般有两种,OpenID connect和SAML。今天我们将会通过一个具体的例子来讲解一下怎么在onelogin中使用OpenID connect中的Authentication Flow来进行SSO认证。

OpenId Connect和Authentication Flow简介

OpenID Connect是构建在OAuth 2.0协议之上的。它允许客户端基于授权服务器或者身份提供商(IdP)来进行用户的身份认证,并获取到用户的基本信息。

OpenID Connect提供了RESTful HTTP API,并使用Json作为数据的传递格式。

我们可以很容易的使用onelogin作为Identity Provider (IdP)来进行SSO认证。

今天我们要讲的是如何使用onelogin来实现Authentication Flow。我们知道OpenId Connect 有很多种模式。

今天介绍的是Authorization Code模式。

Authorization Code流程的步骤如下:

客户端准备身份认证请求,请求里包含所需要的参数

客户端发送请求到授权服务器

授权服务器对最红用户进行身份认证

授权服务得最终用户的统一/授权

授权服务器把最终用户发送回客户端,同时带着授权码

客户端使用授权码向Token端点请求一个响应

客户端接收到响应,响应的Body里面包含在和ID Token和Access Token

客户端验证ID Token,并获得用户的一些身份信息

onelogin的配置工作

如果需要在我们的应用程序中使用onelogin,需要做一些配置工作。我们来具体看一下。

首先我们需要在onelogin中注册一个账号。

注册onelogin是免费的,可以配置3个app和25个用户。做测试使用是足够了。

注册的流程就不多讲了。注册完毕之后,我们就可以在onelogin中创建app了。

在applications tab,我们要使用openid connect,那么就搜索oidc:

可以看到onelogin可以支持多种OIDC的连接协议。既然是onelogin的界面,当然选onelogin的连接了。

输入应用程序的名字,点击save。

在configuration一栏中,redirect URL输入: http://localhost:3000/oauth/callback

这个是认证完之后,跳转回我们自己的app的URL。

然后转到SSO栏,拷贝client ID 和 client Security,修改认证方式为POST

如果你还想创建新的user或者给user设置权限,可以自行探索onelogin的高级功能。

使用应用程序连接onelogin

这里我们选择onelogin提供的官方server的例子 : github.com/onelogin/on…

我们下载下来该程序,将 .env.sample 重命名为 .env

修改里面的变量,主要是OIDC_CLIENT_ID,OIDC_CLIENT_SECRET,SUBDOMAIN和OIDC_REDIRECT_URI这4个值,都是我们在onelogin做配置的时候设置的:

SUBDOMAIN=flydean-dev
OIDC_CLIENT_ID=a3446600-f263-0138-3235-122333243433
OIDC_CLIENT_SECRET=**********
OIDC_REDIRECT_URI=http://localhost:3000/oauth/callback 

然后运行npm intall; npm start 启动nodejs服务即可。

官方的例子是使用的nodejs+express框架和Passport-OpenIdConnect模块来和onelogin进行交互的。

我们看下交互的流程。

1.用浏览器打开http://localhost:3000,进入app的主页面:

2.点login将会跳转到onelogin的授权登录页面:

我们看下网络请求:

可以看到,前面几个状态码都是302,重定向。

从localhost:3000的login页面重定向到:

https://flydean-dev.onelogin.com/oidc/2/auth?response_type=code&client_id=a3446600-f263-0138-3235-064d76eee9d3178911&redirect_uri=http://localhost:3000/oauth/callback&scope=openid profile&state=ohC1Fi0n0YTDELBtNmePDGvb 

大家可以看到,这个重定向添加了oidc协议中需要添加的参数,比如respnse_type=code代表的是使用Authorization Code模式。而client_id就是我们配置的client id。 redirect_uri也是配置的返回链接。

scope表示认证范围,state是一个唯一标记,用来防刷。

然后又重定向到:

https://flydean-dev.onelogin.com/trust/openid-connect/v2?client_id=a3446600-f263-0138-3235-064d76eee9d3178911&grant=cbec20f1-f1d8-4733-9a6f-e98471edfc13 

这一步是onelogin校验了上一步传来的参数,然后进行的再次跳转。

然后又重定向到:

https://flydean-dev.onelogin.com/login 

这是自定义域名的登录页面。

https://flydean-dev.onelogin.com/login2/?return=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1cmkiOiJodHRwczovL2ZseWRlYW4tZGV2Lm9uZWxvZ2luLmNvbS90cnVzdC9vcGVuaWQtY29ubmVjdC92Mj9jbGllbnRfaWQ9YTM0NDY2MDAtZjI2My0wMTM4LTMyMzUtMDY0ZDc2ZWVlOWQzMTc4OTExXHUwMDI2Z3JhbnQ9Y2JlYzIwZjEtZjFkOC00NzMzLTlhNmYtZTk4NDcxZWRmYzEzIiwibm90aWZpY2F0aW9uIjp7Im1lc3NhZ2UiOiJDb25uZWN0aW5nIHRvICoqT3BlbklkIENvbm5lY3QgKE9JREMpKioiLCJpY29uIjoiY29ubmVjdGlvbiIsInR5cGUiOiJpbmZvIn0sImlzcyI6Ik1PTk9SQUlMIiwiYXVkIjoiQUNDRVNTIiwiZXhwIjoxNjAyOTIwNjM0LCJwYXJhbXMiOnt9LCJtZXRob2QiOiJnZXQifQ.hoUjh18mehtBSCINkoGOSDwJFHDBBl_nn47RMSizPfw 

然后onelogin对参数进行加密处理,返回了大家能够看到的页面。

3.输入我们的用户名密码

点击继续。

4.认证成功后,调整到用户信息页面

我们可以看到内部也是经历了一系列的转发调用工作:

我们需要关心的是下面的callback:

http://localhost:3000/oauth/callback?code=2PVdwgQkNip883hql_ub9w3Byug&state=ohC1Fi0n0YTDELBtNmePDGvb 

可以看到在callback中,我们获取到了code,后面可以使用这个code和onelogin进行交互。

5.点击profile,我们将会尝试从onelogin获取到用户的信息

我们关注下请求的链接:

http://localhost:3000/users/profile 

这一步实际上会在后台通过code去请求onelogin的用户信息。

程序中的关键步骤

这个官方的认证程序是用nodejs和express构建的,认证框架主要用的是 passport 和 passport-openidconnect。

我们看下关键代码。

passport配置使用onelogin:

// Configure the OpenId Connect Strategy
// with credentials obtained from OneLogin
passport.use(new OneLoginStrategy({issuer: baseUri,clientID: process.env.OIDC_CLIENT_ID,clientSecret: process.env.OIDC_CLIENT_SECRET,authorizationURL: `${baseUri}/auth`,userInfoURL: `${baseUri}/me`,tokenURL: `${baseUri}/token`,callbackURL: process.env.OIDC_REDIRECT_URI,passReqToCallback: true
},
function(req, issuer, userId, profile, accessToken, refreshToken, params, cb) {console.log('issuer:', issuer);console.log('userId:', userId);console.log('accessToken:', accessToken);console.log('refreshToken:', refreshToken);console.log('params:', params);req.session.accessToken = accessToken;return cb(null, profile);
})); 

从上面代码中可以看到,拿到accessToken之后,是存放在session中的。

使用session存储认证信息:

app.use(session({secret: 'secret squirrel',resave: false,saveUninitialized: true
})) 

login的逻辑操作:

app.get('/login', passport.authenticate('openidconnect', {successReturnToOrRedirect: "/",scope: 'profile'
})); 

callback的逻辑操作:

app.get('/oauth/callback', passport.authenticate('openidconnect', {callback: true,successReturnToOrRedirect: '/users',failureRedirect: '/'
})) 

获取用户profile操作:

router.get('/profile', function(req, res, next) {request.get(`https://${ process.env.SUBDOMAIN }.onelogin.com/oidc/2/me`, {'auth': {'bearer': req.session.accessToken}},function(err, respose, body){console.log('User Info')console.log(body);res.render('profile', {title: 'Profile',user: JSON.parse(body)});});
}); 

使用session中的accessToken来获取用户的信息。

总结

一个简单的SSO程序就搭建完成了。通过passport模块来获取accessToken信息,并存储在session中。

passport模块支持很多种Strategy,包括openID,Local,BrowserID,Facebook,Google,Twitter等。我们可以使用它来适配不同的认证服务。

网络安全入门学习路线

其实入门网络安全要学的东西不算多,也就是网络基础+操作系统+中间件+数据库,四个流程下来就差不多了。

1.网络安全法和了解电脑基础

其中包括操作系统Windows基础和Linux基础,标记语言HTML基础和代码JS基础,以及网络基础、数据库基础和虚拟机使用等...

别被这些看上去很多的东西给吓到了,其实都是很简单的基础知识,同学们看完基本上都能掌握。计算机专业的同学都应该接触了解过,这部分可以直接略过。没学过的同学也不要慌,可以去B站搜索相关视频,你搜关键词网络安全工程师会出现很多相关的视频教程,我粗略的看了一下,排名第一的视频就讲的很详细。 当然你也可以看下面这个视频教程仅展示部分截图 学到http和https抓包后能读懂它在说什么就行。

2.网络基础和编程语言

3.入手Web安全

web是对外开放的,自然成了的重点关照对象,有事没事就来入侵一波,你说不管能行吗! 想学好Web安全,咱首先得先弄清web是怎么搭建的,知道它的构造才能精准打击。所以web前端和web后端的知识多少要了解点,然后再学点python,起码得看懂部分代码吧。

最后网站开发知识多少也要了解点,不过别紧张,只是学习基础知识。

等你用几周的时间学完这些,基本上算是具备了入门合格渗透工程师的资格,记得上述的重点要重点关注哦! 再就是,要正式进入web安全领域,得学会web渗透,OWASP TOP 10等常见Web漏洞原理与利用方式需要掌握,像SQL注入/XSS跨站脚本攻击/Webshell木马编写/命令执行等。

这个过程并不枯燥,一边打怪刷级一边成长岂不美哉,每个攻击手段都能让你玩得不亦乐乎,而且总有更猥琐的方法等着你去实践。

学完web渗透还不算完,还得掌握相关系统层面漏洞,像ms17-010永恒之蓝等各种微软ms漏洞,所以要学习后渗透。可能到这里大家已经不知所云了,不过不要紧,等你学会了web渗透再来看会发现很简单。

其实学会了这几步,你就正式从新手小白晋升为入门学员了,真的不算难,你上你也行。

4.安全体系

不过我们这个水平也就算个渗透测试工程师,也就只能做个基础的安全服务,而这个领域还有很多业务,像攻防演练、等保测评、风险评估等,我们的能力根本不够看。

所以想要成为一名合格的网络工程师,想要拿到安全公司的offer,还得再掌握更多的网络安全知识,能力再更上一层楼才行。即便以后进入企业,也需要学习很多新知识,不充实自己的技能就会被淘汰。

从时代发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同学们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,能力越强机会才越多。

尾言

因为入门学习阶段知识点比较杂,所以我讲得比较笼统,最后联合CSDN整理了一套【282G】网络安全从入门到精通资料包,需要的小伙伴可以点击链接领取哦! 网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值