单点登录的一种常规方法

简介:

常规的登录

常规的是通过session
步骤:

  1. 用户在浏览器登录
  2. 后台鉴权,若登录成功,则把用户信息写入session,servlet自动生成JSESSIONID 返回浏览器;
  3. 浏览器把JSESSIONID 写入cookie
    说明:cookie是浏览器的存储文件,存储的只是JSESSIONID,而不是用户信息;

JSESSIONID 只是一个钩子,用户信息其实存储在服务器端.

比如我在浏览器登录之后,重新打开一个标签页,输入相同的地址,仍然是登录状态,因为标签页共享cookie.
也就是说我只要获取到JSESSIONID ,就可以获取用户隐私信息,比如除用户名以外的其他信息(密码,姓名,年龄等).也可以做一些敏感操作,比如修改密码

浏览器发送请求时会带上cookie
这样服务器端才知道是否登录过:
浏览器

例如,我获取到JSESSIONID 之后,使用HTTP模拟发送请求:
http请求模拟器

服务器端是如何判断是否登录

/***
     * 判断是否已登录
     * @param user2
     * @return
     */
    public static boolean isLogined(User user2,String loginFlag){
        if(ValueWidget.isNullOrEmpty(user2)||ValueWidget.isNullOrEmpty(user2.getUsername())
                ||loginFlag == null
                        ||( !loginFlag.equalsIgnoreCase(Constant2.FLAG_LOGIN_SUCCESS))){
            return false;
        }else{
            return true;
        }
    }

    /***
     * 判断是否已登录
     * @param session
     * @return
     */
    public static boolean isLogined(HttpSession session){
        String loginFlag = (String) session
                .getAttribute(Constant2.SESSION_KEY_LOGINED_FLAG);
        User user2 = (User) session.getAttribute(Constant2.SESSION_KEY_LOGINED_USER);
        return isLogined(user2,loginFlag);
    }

通过 cookie 实现单点登录

  1. 登录之前,会向服务器请求一个随机token,同时返回cookie,例如:
    CCC=63314c585041e889766fec6657879c; Expires=Mon, 21-Sep-2015 06:48:27 GMT; Path=/
  2. 登录时带上这个cookie(即CCC=63314c585041e889766fec6657879c)
  3. 服务器鉴权,登录成功之后,把登录凭证和CCC 绑定,
    即服务器可以通过CCC 判断是否登录,也可以通过CCC 获取用户敏感信息.

这样的话,只要登录过,用户不主动清除cookie,那就一直是登录状态.
如果用户主动清除了cookie,那就不是登录状态了
2019-03-06_22-35-38.jpg

详细流程,逻辑
2019-03-06_22-36-02.jpg
(1)登录前,浏览器先向认证服务器请求一个OTP,认证服务器返回OTP,同时返回一个cookie给浏览器;
(2)认证服务器把OTP 和CCC(cookie) 挂钩;
(3)登录时连同带上OTP
(4)若登录成功,则认证服务器返回登录凭证(access token)给浏览器;
(5)认证服务器把CCC 和登录凭证挂钩;
(6)通过CCC 可以判断用户是否有权限.

所以,
(a)可以通过CCC 获取登录凭证
(b)也可以通过OTP 获取登录凭证

根本原因:服务器把OTP 和CCC(cookie) 挂钩

那么CCC记在什么地方?
浏览器

获取OTP的接口返回:
OTP接口返回

效果:

A和B是同一个公司的应用,
在同一个浏览器中登录了应用A ,就可以在该浏览器中直接访问应用B,而不用重新登录.

具体实现原理:

1,登录之前访问 认证系统的动态口令接口,获取动态口令:auth_token
同时会返回cookie:CCC ,目的:把浏览器和 auth_token 挂钩
等浏览器访问其他应用时,把该CCC带过去.
2,登录时参数包括(1)中返回的auth_token ;
3,访问应用B 时,浏览器会把cookie中的CCC传过去,应用B 拿到之后,给认证系统认证,判断是否登录;
若认证通过,则返回用户信息
单点登录

认证系统

单点登录的目的

同一个公司的应用,只需要登录一次。
比如我登录了阿里云,再打开淘宝 ,天猫或钉钉就不用重复登录(输入用户名和密码)。

具体场景(Web)

image.png
小明登录了 Web应用A,再进入Web应用B时,不用重新输入用户名和密码,就自动登录了。

问题:应用A和应用B要拥有相同的父域名吗?

不用!!!
不用!!!
不用!!!
阿里云 和淘宝的域名就不一样

具体实现(基于 cookie)

otp :one time password 就是一次一密

认证中心接口

接口一:jsonp接口,获取 otp
请求方式:jsonp
获取 otp,同时可以判断是否已登录
http://auth.xxx.com/authentication/otp.jsonp?callbk=callbkMethod&clientId=应用的clientId

返回
{
"isLogined":true,
"otp":"433u23"
}

注意:jsonp 接口只需要 clientId,不需要 secret
接口二:使用 otp登录
请求方式:post
http://auth.xxx.com/authentication/login.json
/>参数:
username:
password:
otp:接口一获取的 otp
imgCode:图形验证码

返回:
{
"access_token":"",
"refresh_token":"",
"timeout":12000
...
}

接口三:opt 换取 access_token
请求方式:post
http://auth.xxx.com/authentication/token.json?secret=应用的secret&clientId=应用的clientId&opt=433u23
返回:
{
"access_token":"",
"refresh_token":"",
"timeout":12000
...
}

认证中心的作用

  1. 判断是否已登录;
  2. otp 换access_token

未登录-登录流程

image.png

应用 A 已经登录,访问应用 B 时

image.png

相关文章
|
小程序 JavaScript 程序员
小程序最新标准授权登录流程+逻辑
小程序最新标准授权登录流程+逻辑
181 0
|
7月前
|
安全 搜索推荐 Java
SpringSecurity扩展用户身份信息(UserDetails)的方式
通过上述步骤,你就能在Spring Security中扩展 `UserDetails`,进而实现更加个性化和复杂的用户认证和授权机制。记住,在添加更多字段时,保持系统安全性的同时,也需要考虑到用户隐私的保护。
574 1
|
JavaScript 前端开发 PHP
什么是单点登录,单点登录的逻辑,思路,
什么是单点登录,单点登录的逻辑,思路,
221 0
|
9月前
|
存储 缓存
实现单点登录的方式
实现单点登录的方式
109 1
|
前端开发
前端学习笔记202305学习笔记第二十二天-登录页校验封装和token封装2
前端学习笔记202305学习笔记第二十二天-登录页校验封装和token封装2
80 0
|
前端开发
前端学习笔记202305学习笔记第二十二天-登录页校验封装和token封装1
前端学习笔记202305学习笔记第二十二天-登录页校验封装和token封装1
67 0
|
安全 数据安全/隐私保护 UED
单点登录的两种实现方式,分别有啥优缺点?
单点登录的两种实现方式,分别有啥优缺点?
373 0
|
存储 NoSQL 安全
单点登录原理与简单实现
1、http无状态协议 web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关联,这个过程用下图说明,三次请求/响应对之间没有任何联系
单点登录原理与简单实现
|
存储 弹性计算 网络协议
企业用户认证及文件权限控制【手把手操作指南】
以一家水泵公司的组织架构图和实际需求为切入点, 介绍如何在阿里云上结合NAS文件存储搭建用户认证和权限管理,使得企业用户实现虚拟桌面并拥有大空间存储容量。从企业管理员的视角操作,手把手操作,从无到有实现企业用户认证和文件权限管理。
650 0
DRF修改权限、用户认证方式
修改权限、用户认证方式 在settings中全局配置 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.