js 身份认证,用户信息水印功能开发

这个需求主要是一个 http 跳转的过程,但实现过程相当曲折。
首先说下涉及到的项目:
内网首页(静态HTML页面,由信息报送生成)
门户项目
单点登录身份认证中心。
内网首页 门户项目 我手里可以控制,单点系统为接口对接。

一开始我定下的实现逻辑是:在门户用session 存储用户信息;
①内网首页首先通过jsonp的方式 首先请求 门户接口获取用户信息;
②如果请求到的 用户信息为空。url 重定向到 门户的 信息认证接口。
③ 信息认证接口 是接收 单点登录 回调的接口,点单登录回调会 传递票据参数,如果这个参数为空 就会 携带回调service 发起到 单点系统 进行登录认证。
④ 单点登录系统 首先判断 用户是否登录,如果登录就会 带上票据 回调门户应用。
⑤ 单点登录系统 判断 用户未登录,会进入 单点系统的 登录页面进行登录操作,登录成功 根据回调service 进行回调跳转。
单点系统的登录功能 都是 通过在 HTML 中通过JS调用后台接口实现的。
⑥ 单点回调会 携带 票据参数;门户 根据这个票据参数 调用 单点的验证接口,单点系统验证成功会返回 票据对应的用户信息。
⑦ 门户将 用户信息 存储进 session 中; 并回跳到 内网首页发起身份认证的 静态页面。
⑧ 静态页面再次发起身份认证 就会 收到用户信息。

后来,需求变动 要求单点登录页面 个性化,要修改,本来沟通的是 登录页面切好后 给单点登录系统来实现。
对接工作几近完成时,收到信息 单点登录系统 不配合做登录页面,我们自己做登录功能,调用对方的接口。

至此,开始入坑。。。
前面说的实现逻辑,只有 静态页面请求 用户信息接口是跨域的,这个通过 jsonp 的方式可以解决。
现在自己做登录页面 调用对方的登录接口,页面上 调用对方的登录接口,全部跨域,(功能做完后发现 对方的接口支持 jsonp 方式调用,但登录接口很多只能 post 方式请求,jsonp 又不支持post 请求)
开始的时候 就认为了 对方的接口不支持 jsonp 方式调用,就没考虑jsonp。
网上查询后,决定使用后台代理的方式 实现调用对方的接口。(https 请求)
解决跨域问题后 任务进度看似顺利,到最后开始接口综合联调时,问题就出现了。
获取登录状态 一直返回false。 百思不得解,慌了 这块如果过不去,前面写的就都白费了。开始想这中间哪个环节出了问题,查看接口文档,单点登录 页面的调用,js调试单点的页面,发现没问题,是他这接口限制了调用方吗? 我把这个链接直接粘到浏览器里面 返回的是false,在单点这登录后 再刷了下这个链接 变成true了,确认接口没问题。
那这个问题就出在我这里了。静下心来想想 为什么 服务器能返回用户的信息,因为session 中有用户的信息啊,为什么我后台发起的请求session中没信息。然后。。。问题就明白了,问题出现在会话机制上面,浏览器每次发起请求 携带的cookie 是一样的;但在后台发起的请求是每次 新建一个连接来发送请求,这才想起来 http请求 是无状态的,相当于我在谷歌浏览器点了登录按钮,然后去 IE里获取登录状态 这肯定行不通啊。 但是后台发送的请求支持会话保持吗? 这我哪里知道,网上查了查,还好挺多的例子。有三种方式可以实现,一个是 所有的请求URL 都通过同一个 httpclient 发送,这种实现 不太适合我的应用场景;第二种是保存 cookie信息,每次请求前 设置一遍cookie,这个方法可以,就是感觉有费事; 第三种是 设置一个 上下文,所有的请求都在这个上下文中执行,看到这个 感觉不错,代码也比较整洁;这三种实现个人认为 第一种需要保存一个连接 这种都是资源,访问量大的时候,我保存的链接会不会把 单点系统搞挂掉,这个我心有隐隐有这种感觉,对于第二三中方法 没什么抵触的,第三种 写法特别简便,就选用了第三种方式。
到此 保持会话这个问题 就解决了,接口联调了一下 OK 解决了,登录状态有了。

怎么算入坑呢,这还不算完,在尝试解决上面问题的时候 就有想到了一个新的问题, 就是 单点登录系统是直接在浏览器中进行登录的,我的请求是通过后台发送的,这就到这 用户登录单点登录后,再进内网首页是 取不到用户信息的,还需要再做一次登录才行。

这只能算是问题了,想要后台 和 浏览器 有相同的身份 就需要 后台和浏览器有相同的cookie,后台 想拿到cookie 只能是 通过js传过去;
但是 这逻辑不可能实现,js 给门户 发请求 只能携带 门户的cookie;是没法携带 单点系统的cookie的;js 没办法获取到 跨域的cookie;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值