单点登录SSO

编程

借助阿里云的应用身份服务

 

什么是登录

一、(session&cookie模式)

1、用户向服务器发送用户名和密码。
2、服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。
3、服务器向用户返回一个 session_id,写入用户的 Cookie
4、用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。

5、服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。

服务器保存session  客服端浏览器cookie一般存了个jsessionid的值,后面浏览器每次提交会自动带上该值

二、JWT(json web token)模式  

JWT头部           JWT有效载体          JWT签名

JWT头部    {"alg": "HS256","typ": "JWT"}   base64: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
JWT有效载体    { "sub": "1234567890", "name": "John Doe", "admin": true }   base64:eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
JWT签名    HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)      base64:TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

JWT完整字符串:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

 

使用一般是请求头里加入Authorization,并加上Bearer标注。
Authorization: Bearer <token>

 

JWT有效载体中官方规定的7各字段

iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号

 

单点登录

系统1www.abc.com   系统2www.def.com    系统3SSO):www.sso.com

1:访问www.abc.com由于没有登录访问www.sso.com?service=www.abc.com
2:由于www.sso.com没有登录,提升用户输入用户名密码登录。
3:用户与SSO系统建立会话(生成一份Token,写到Cookie中,保存在浏览器上)
4:随后SSO重定向回系统ABC,并把Token携带过去给系统ABC,重定向的地址如下:www.abc.com?token=xxxxxxx
5:系统ABC收到token后,通过后端向SSO验证token是否正确,如果正确系统ABC与用户建立局部会话(创建Session
6:此时,用户想要访问系统DEF发现便没有登录这跳转到www.sso.com?service=www.def.com
7:因为用户与SSO系统建立了全局会话,访问www.sso.com?service=www.def.com时会带上cookie
8:这时SSO系统已经登录,于是在重定向系统DEF, www.def.com?token= xxxxxxx
9:同样系统DEF收到token后,通过后端向SSO验证token是否正确,如果正确系统DEF与用户建立局部会话(创建Session

一、cookie实现(必须统一域名,未来不可用苹果浏览器开发封杀chromefirefox已经开始了)

app1.a.com    app2.a.com    sso.a.com

登录OSS.a.com是把cookie写在a.com域下,这样app1, app2都在该域下。通用了cookie

二、Jsonp和页面重定向技术

 

CAS

一、我们看看访问app1系统时的流程

1:用户访问app1系统,app1系统是需要登录的,但用户现在没有登录。

2:跳转到CAS server,即SSO登录系统,以后图中的CAS Server我们统一叫做SSO系统。 SSO系统也没有登录,弹出用户登录页。

3:用户填写用户名、密码,SSO系统进行认证后,将登录状态写入SSOsession,浏览器(Browser)中写入SSO域下的Cookie

4SSO系统登录完成后会生成一个STService Ticket),然后跳转到app1系统,同时将ST作为参数传递给app系统。

5app1系统拿到ST后,从后台向SSO发送请求,验证ST是否有效。

6:验证通过后,app1系统将登录状态写入session并设置app域下的Cookie

至此,跨域单点登录就完成了。以后我们再访问app1系统时,app1就是登录的。

二、接下来,我们再看看访问app2系统时的流程。

1:用户访问app2系统,app2系统没有登录,跳转到SSO

2:由于SSO已经登录了,不需要重新登录认证。

3SSO生成ST,浏览器跳转到app2系统,并将ST作为参数传递给app2

4app2拿到ST,后台访问SSO,验证ST是否有效。

5:验证成功后,app2将登录状态写入session,并在app2域下写入Cookie

这样,app2系统不需要走登录流程,就已经是登录了。SSOappapp2在不同的域,它们之间的session不共享也是没问题的。

 

OAuth2.0

各种第三方登录QQ登录,微信登录,一般都是使用标准的OAuth2.0

接入过第方登录的就知道,要有APP_ID APP_SECRET 主要包括(应用ID,应用名称,应用SECRET,和跳转地址)

1: 从信任角度来看。OAuth2.0授权服务端和第三方客户端不属于一个互相信任的应用群(通常都不是同一个公司提供的服务),第三方客户端的用户不属于OAuth2.0授权服务端的官方用户;而单点登录的服务端和接入的客户端都在一个互相信任的应用群(通常是同一个公司提供的服务),各个子系统的用户属于单点登录服务端的官方用户。

2: 从资源角度来看。OAuth2.0授权主要是让用户自行决定——“我”在OAuth2.0服务提供方的个人资源是否允许第三方应用访问;而单点登录的资源都在客户端这边,单点登录的服务端主要用于登录,以及管理用户在各个子系统的权限信息。

3: 从流程角度来看。OAuth2.0授权的时候,第三方客户端需要拿预先“商量”好的密码去获取Access Token;而单点登录则不需要。

 

 

以上是 单点登录SSO 的全部内容, 来源链接: utcz.com/z/516689.html

回到顶部