PHP单点登入的问题

查看:96
本文介绍了PHP单点登入的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

我做了一个单点登录遇到一个问题是:比如有A、B、C三系统,当没有登入的时候会跳到S系统进行登入,登入成功会生成一个token,并把token传回来,同时会把token存到redis里面。但是B、C系统如何去获取那个token?

解决方案

既然这么多人不认同我的简单的想法那我就改正一下吧:
单点登录:
一个简单的场景:当用户第一次访问应用系统的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份校验,如果通过校验,应该返回给用户一个认证的凭据--ticket;用户再访问别的应用的时候,就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证系统进行校验,检查ticket的合法性。如果通过校验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。

所以单点登录的原理也就是这样,下面说一下实现原理,当用户通过认证系统的时候,会把ticket保存在cookie中,这样,用户夹带cookie登录其他系统的时候就可以附带上这个cookie进行验证了;但是这样会出现一个缺陷,就是不支持跨域,如何使其支持跨域呢,除了楼下的高票回答保存在数据库中外,还有一种方法,jsonp,原理图如下:

验证方法如下:

1、 用户通过登录子系统进行用户登录;
2、 用户登录子系统记录了用户的登录状态、OpenId等信息;
3、 用户使用业务子系统;
4、 若用户未登录业务子系统则将用户跳转至用户登录子系统;
5、 用户子系统通过JSONP接口将用户OpenId传给业务子系统;
6、 业务子系统通过OpenId调用验证服务;
7、 验证服务返回认证信息、业务子系统构造用户登录凭证;(此时用户客户端已经与子业务系统的验证信息已经一一对应)
8、 将用户登录结果返回用户登录子系统,若成功登录则将用户跳转回业务子系统;
9、 将授权后的内容返回客户端;

总结:整个单点登录的机制决定了OpenId是会出现在客户端的,所以OpenId需要有过期机制,假如用户在一个终端登录的话可以选择在用户每次登录或者每次退出时刷新OpenId,而在多终端登录的情况下就会出现矛盾:当一个终端刷新了OpenId之后其他终端将无法正常授权。这个时候就要采用单用户多OpenId的解决方案了。每次用户通过用户名/密码登录时,产生一个OpenId保存在Redis里,并且设定过期时间,这样多个终端登录就会有多个OpenId与之对应,不再会存在一个OpenId失效所有终端验证都失效的情况。

参考文章
百度:单点登录
单点登录的实现原理

———————————————————分割线————————————————————
以下是我之前的回答,回答的简单没考虑全面请见谅~
拿到这个token之后,用curl或者header的方式把值分别发送到另外两个B、C系统的接口中,接口中GET或则POST接收发送过来的token参数,然后处理这个token值。比如把token值存入redis、session等

这篇关于PHP单点登入的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆