在onelogin中使用OpenId Connect Implicit Flow

简介: 在onelogin中使用OpenId Connect Implicit Flow

目录



简介



onelogin支持多种OpenId Connect的连接模式,上一篇文章我们讲到了使用openId的Authentication Flow,今天我们将会讲解一下如何使用Implicit Flow。


OpenId Implicit Flow



Implicit Flow也叫做隐式授权


image.png


上图就是一个隐式授权的例子,和Authorization Code模式不同的是,认证服务器返回的是一个access token片段,只有这个片段,我们是无法得到access token的。


这里我们需要额外请求一次client resource服务器,服务器将会返回一个script脚本,通过这个脚本,我们对access token片段进行解析,得到最终的access token。


在隐式授权模式,一般用在app或者websites没有后台逻辑的情况。也就是说所有的授权都是在前端完成的。


尤其对于那种单页面应用来说,隐式授权模式特别有用。


我们再看一下在onelogin中的隐式授权流程:


image.png

  1. 用户尝试建立和你的client app的连接,这个请求将会重定向到onelogin,并且带上配置的唯一client_id。
  2. onelogin将会对用户信息进行认证和授权。
  3. 授权过后的用户信息将会以id_token (JWT)的形式,传递给onelogin中配置的回调地址。
  4. client app使用onelogin的public key对id_token进行校验,如果一切ok,那么将会建立好连接。


我们考虑下隐式授权模式的安全性。


在隐式授权模式下,client app需要从onelogin获取到公钥,然后使用这个公钥去解析onelogin返回的id_token。


虽然恶意用户可能获取到client_id和onelogin的公钥,但是返回的id_token只会发给配置好的callback地址,所以仍然是安全的。


创建onelogin的配置



虽然我们在前面的文章中在onelogin中创建了一个app,因为callback的不同,我们这里新创建一个app。


填上我们的callback地址: http://localhost:3000


其他的和之前的配置保持一致。


我们看下最新的SSO配置:


image.png


这里我们需要保存最新的client_ID,因为不是Authentication Flow模式,我们不需要用到client_secret。


注意这里的两个Issuer URLs,这里存储的是onelogin的配置信息。


页面的运行和请求流程



我们从onelogin的官网例子中下载隐式授权的单页面应用。


https://github.com/onelogin/onelogin-oidc-node/tree/master/2. Implicit Flow

在javascript/main.js中修改OIDC的配置:


const ONELOGIN_CLIENT_ID = '90a0e970-f2b6-0138-6171-0a5535c40b31178911';
const ONELOGIN_SUBDOMAIN = 'flydean-dev';


然后运行npm install;npm start来启动这个单页面的应用程序。


image.png


输入用户名密码,我们会跳回localhost页面。


这里我们会调用 https://flydean-dev.onelogin.com/oidc/2/certs 去拿到onelogin的公钥。


通过个这个公钥和返回的id_token,就可以拿到用户的信息。


image.png


关键代码


因为是单页面应用,所有的请求其实都是通过JS来执行的。我们看下系统的关键代码。


为了使用openid协议,这里的例子使用了oidc-client.min.js,通过这个客户端来进行openid协议的连接工作。


下面是页面的openid connect配置信息:


var settings = {    
    authority: 'https://' + ONELOGIN_SUBDOMAIN + '.onelogin.com/oidc/2',
    client_id: ONELOGIN_CLIENT_ID,
    redirect_uri: window.location.origin,
    response_type: 'id_token token',
    scope: 'openid profile',
    filterProtocolClaims: true,
    loadUserInfo: true
};


有了这些配置信息,我们就可以创建oidc的manager:


var mgr = new Oidc.UserManager(settings);


关键代码很简单,点击login的时候,需要进行页面跳转到onelogin进行授权登录:


function redirectToLogin(e) {
  e.preventDefault();
  mgr.signinRedirect({state:'some data'}).then(function() {
      console.log("signinRedirect done");
  }).catch(function(err) {
      console.log(err);
  });
}


授权完成之后,跳转回本机页面之后,需要校验回调信息,并从该信息中解析出用户的信息,并展示在页面上:


function processLoginResponse() {
  mgr.signinRedirectCallback().then(function(user) {
      console.log("signed in", user);
      document.getElementById("loginResult").innerHTML = '<h3>Success</h3><pre><code>' + JSON.stringify(user, null, 2) + '</code></pre>'
  }).catch(function(err) {
      console.log(err);
  });
}


所有的逻辑都封装在oidc-client.min.js,对程序员非常友好。


总结



以上就是在onelogin中使用OpenId Connect Implicit Flow的基本思路和流程。希望大家能够喜欢。

相关文章
Flutter之运行提示Could not update files on device: Connection closed before full header was received
Flutter之运行提示Could not update files on device: Connection closed before full header was received
757 0
|
3月前
|
API
【API Management】使用 APIM Inbound Policy 来修改Content‐Type Header的值
【API Management】使用 APIM Inbound Policy 来修改Content‐Type Header的值
【API Management】使用 APIM Inbound Policy 来修改Content‐Type Header的值
|
5月前
|
Kubernetes 容器 Perl
k8s部署seata 报错 没有提供足够的身份验证信息 [ http-nio-7091-exec-2] [ty.JwtAuthenticationEntryPoint] [ commence] [] : Responding with unauthorized error. Message - Full authentication is required to access this resource
Kubernetes pod 在16:12时出现两次错误,错误信息显示需要完整认证才能访问资源。尽管有此错误,但页面可正常访问。附有yaml配置文件的图片。
458 2
|
6月前
|
开发工具
App Store Connect Operation Error ERROR ITMS-90087: “Unsupported Architectures
App Store Connect Operation Error ERROR ITMS-90087: “Unsupported Architectures
53 1
|
Shell
wandb.errors.UsageError: api_key not configured (no-tty). call wandb.login(key=[your_api_key])
wandb.errors.UsageError: api_key not configured (no-tty). call wandb.login(key=[your_api_key])
3456 0
wandb.errors.UsageError: api_key not configured (no-tty). call wandb.login(key=[your_api_key])
|
安全 API
OAuth 2.0 之 Authorization code 与 Implicit
OAuth 2.0 之 Authorization code 与 Implicit
152 0
解决Only void and foreign elements can be self closed “ xxxx-xxxx“报错
解决Only void and foreign elements can be self closed “ xxxx-xxxx“报错
解决Only void and foreign elements can be self closed “ xxxx-xxxx“报错
|
存储 JSON JavaScript
在onelogin中使用OpenId Connect Authentication Flow
在onelogin中使用OpenId Connect Authentication Flow
在onelogin中使用OpenId Connect Authentication Flow
|
缓存 中间件 API
【laravel】 Unable to prepare route [api/user] for serialization. Uses Closure.
【laravel】 Unable to prepare route [api/user] for serialization. Uses Closure.
613 0
【laravel】 Unable to prepare route [api/user] for serialization. Uses Closure.
Unable to add window --token is not valid
Unable to add window --token is not valid
下一篇
无影云桌面