Simple SSO Example
PREPARES
一个专门用来登录的项目PASSPORT, 参考 passport_site_index.php
独立子项目A, 参考a_sub_site_index.php
独立子项目B, 参考a_sub_site_index.php
FEATURES
PASSPORT项目能够在登录后,转跳到指定的地址
各个独立子项目都有自己的用户系统帐号,也就是都有自己的user_id,且存在一个表关联自己用户的user_id与PASSPORT系统的用户passport_user_id
各个独立子项目能够查询 PASSPORT项目 当前 是否已经有登录,获得passport_user_id,进而登录本系统
REALIZATION
PASSPORT需要提供一个JSONP接口用于返回是否登录状态以及passport_user_id,同时该接口必须要校验请求的Referer是否是被允许的独立子项目域名,同时该JSONP返回的passport_user_id数据必须是通过对应子项目的RSA公钥加密后的结果,
一个返回格式例子:
{
"status":"AUTH_MEMBER",
"data" : "公钥加密后的{'passport_user_id':123,'timestamp':1234567890}"
}
独立子项目在其所有页面上,存在一段js,用于用户在页面加载后就查询passport_user_id,然后刷新本项目用户登录状态为 未登录或已登录,所以独立子项目需要一个处理该js转发过来的PASSPORT JSONP数据然后处理修改本项目用户状态SESSION值,然后返回给js是否需要转跳刷新页面,
一个返回格式例子:
{
"result": "user_changed",
"redirect": "https://xxx.com"
}
同时子项目即使是在有RSA加密的情况下,为了防止被恶意伪装的JSONP数据,我们需要校验timestamp是否在一分钟以内的请求,否则无效。
跑例子要注意
需要分别把2个开发域名http://passport.dev
与http://sso.dev
给passport_site_index.php与a_sub_site_index.php。
然后到SSO/Passport.php里把子站的公钥填到SSOPassport::$ssoPublicKeyMap里,子站的私钥填到SSO/Subsite.php的SSOSubsite::$ssoPrivateKey里。
版权声明:
1、该文章(资料)来源于互联网公开信息,我方只是对该内容做点评,所分享的下载地址为原作者公开地址。2、网站不提供资料下载,如需下载请到原作者页面进行下载。
3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考学习用!
4、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。