TEL:400-8793-956
当前位置:程序、服务器

如何实现跨域单点登录?

提问者:网民 近期获赞:674 浏览人数:22 发布时间:2020-12-09 11:40:12

问:申请网站

 
应用1:http://app1.com
应用2:http://app2.com
实施方案
 
登录应用程序1,跳转到http://accounts.com/login登录
成功的登录跳转将在地址后以令牌响应,例如:http://app1.com/callback?token=xxxx验证登录
浏览App 1之后,用户输入App 2(用户可以自己输入App 2.com的地址访问应用2)。
此时,应用程序2经过“以某种方式”以确定是否先前的应用程序1已登录,请设置当前用户是否已登录。
问题是如何在方案中实施第4条?
我现在在想的是:
 
同步登录:像discuz一样,最好在登录后等待几秒钟,以便其他应用程序有足够的时间来编写cookie,但是我不喜欢“等待几秒钟”的方式。
使用jsonp:尽管您知道如何使用jsonp进行跨域请求,但实现起来很困难,如果处理不当,则会遇到安全问题。
我想知道您是否有什么好方法?
————————————————华丽的分隔线———————————————————————————————— -
在下午,我花了一些时间学习两组网站的登录方式。
 
Google.com和youtube.com
淘宝网和淘宝网
I. google.com和youtube.com
场景1:他们都没有登录,但是他们浏览了YouTube。
 
登录google.com并通过https://accounts.google.com/ServiceLoginAuth验证用户名密码
验证后,跳至“https://accounts.google.com/CheckCookie检查是否浏览了其他应用程序,例如YouTube”,然后跳回到“https://accounts.youtube.com/accounts/SetSID登录”
最后,跳回到google.com主页
方案2:您已经登录google.com,但尚未浏览YouTube,也尚未登录。
 
因为我登录到Google.Com,所以我是第一次访问YouTube时直接从地址栏中输入地址。
进入YouTube主页显示我需要登录,因此请单击登录。
仍跳至,https://accounts.google.com/ServiceLoginAuth但跳回yutube主页,无任何输入
2. taobao.com和etao.com
 
无论是否登录taobao.com,我都转到etao.com的主页,首先检查cookie是否已登录。
登录时,etao.com主页显示登录状态
如果尚未登录,请跳至http://jump.taobao.com/jump?target=http%3A%2F%2Fwww.etao.com%2F%3Ftbpm%3Dttaobao.com上检查是否有登录名
登录并跳回http://pass.etao.com/add?...登录后,返回首页,登录状态为登录
如果您尚未登录,您仍将跳回到主页。登录状态尚未登录。
现在,您基本上知道该怎么做了,或者有什么更好的方法呢?让我们来谈谈它。
 
答:研究并阅读搜狐的内容并共享。是否在login.common.com上统一登录?Return = http://www.a.com(带有要返回的地址)
如果成功验证了返回JS,请登录。共同。com / success连接返回的JS并显示它,然后跳回到return参数中的值。那么此JS的内容是什么?它通过JS调用每个站点并生成自己的cookie。当前,UCenter也使用这种方法。登录中心应具有类似于应用程序列表的内容。
 
答:我知道三种方式:1。页面与JS跨域请求嵌套在一起,就像Kangsheng的UCenter产品一样。
2.让页面依次跳过不同应用程序的域名,以解决跨域问题。
3.与Google一样,用户会主动提出要求。详细说明如下:
1. App1,app2和app3连接到UC。用户请求app1登录。App1程序请求UC在验证验证的同时同步登录。代码(如下)打印在页面上。
 
<script type =“ text / javascript” src =“ http://app2/api/uc.php?time = 132 type = “ text / javascript” src = “ http://app2/api/uc.php?time = 132 
4695020&code = f97bp%2FyiCrfFF%2B4lIndT1k3PoVk5%2BmVvNJMYiBzq7ssWE8FS
smj7T3jujWyDpKpT2t8vO7o5M19FlzvNdihXMDWqvyoko9C3lkpG%2BQX57zL112gb
GH%2FPwS9YD9A3%2BQVKNFSDzriFOqq9IFWJx6q4x%2Fk%2FMAltJygTiwRZ“  
reload =“ 1”> </ script>重新加载= “ 1” > </ script>
 
<script type =“ text / javascript” src =“ http://app3/api/uc.php?time = 1324<script type = “ text / javascript” src = “ http://app3/api/uc.php?time = 1324  
695020&code = 2b55qIaEphMxdvEYZJok8GEoDW%2BctvZeWS84LvaH8MHf8AzrRXiLD
ZFIvS4cmUkXAGGeDnSVQ9rsu62iDnSAUSTEdSH2%2Bup5xZFvtgl9KRMEcOLLySih2w
vNL%2BSjRQgqErT5kEK0878zxlhRQn0ypgxXgmoCY3zE87sy“ reload =” 1“> </ script> 重新加载= “ 1” > </ script>
注意uc.php需要P3P标头
 
header('P3P:CP =“ CURa ADMa DEVa PSAo PS我们的总线UNI PUR IN DEM STA PRE COM NAV OTC NOI DSP COR”)('P3P:CP =“ CURa ADMa DEVa PSAo PS我们的公共汽车总站内部数据中心STA PRE COM NAV OTC NOI DSP COR” );
2. App1,app2,app3,用户请求登录app1,app1程序允许浏览器在验证通过时跳转到带有参数的app2.com(将JS添加到输出页面,类似于以下代码),然后跳转到app3。 com...。依次使用Cookie,最后跳回app1.com。
 
<script type =“ text / javascript” reload =“ 1”> window.location.href = \'app1.com type = “ text / javascript” reload = “ 1” >窗口。位置。href = \'app1 。com 
/loginAuth.phpcode=ctvZeWS84LvaH8MHf8AzrRXiLDZFIvS4cmUkXAGGeDnSVQ9rsu62i/ loginAuth 。phpcode = ctvZeWS84LvaH8MHf8AzrRXiLDZFIvS4cmUkXAGGeDnSVQ9rsu62i
DnSAUSTEdSH2%2Bup5xZFvtgl9KRMEcOLLySih2wvNL%2BSjRQgqErT5kEK0878zxlhRQn0ypDnSAUSTEdSH2 %2Bup5xZFvtgl9KRMEcOLLySih2wvNL %2BSjRQgqErT5kEK0878zxlhRQn0yp
gxXgmoCY3zE87s'\'; </ script>'\'; </ script>
缺点是–页面在用户视图中会出现一段时间的白屏!不适合多种应用3。Google方法的缺点是用户必须主动单击登录按钮,并且无法实现无缝同步登录。优点是它适用于多种应用。Which one is good depends on what requirements, if you do not need to achieve seamless synchronous login, it must be the use of Google's solution!
 
答:Google的这种方法应该是一个相对完整的过程,但是仍然存在一些缺点,即当我没有访问YouTube时,Google登录后,它并没有自动为我登录YouTube,您需要单击登录手动。尽管您无需输入密码或其他任何密码,但还是有些麻烦。实际上,您可以通过将Google域JS挂在YouTube上来进行改进。当然,此JS实际上是通过动态脚本输出的。在脚本中检查用户时,我们已经登录到Google域。如果我们已经登录,我们会动态输出让其登录YouTube域的JS。尽管只有一步之遥,但这样做的好处是实际上可以分散您花费时间编写Cookie的时间,这是解决问题的第一种方法子站,使用户几乎感觉不到。
 
答:我有一个不太“对称完美”的解决方案。当有更多应用程序时,这可能会更麻烦,但这也是一种解决方案:在app1.com的回调页面的末尾,添加脚本标签
 
<script src =“ http://app2.com/callback= <?php%20echo%20 $ token%20?>”“ ...<?php %20echo %20 $ token %20吗?> “ ...
这允许app2登录,但是您还可以看到,如果有更多应用程序,则回调页面必须提及其他应用程序的回调地址。我在说的麻烦是这个。
上一篇: 如何分析SQL查询速度等问题,被访员问到混乱
下一篇: ASP.NET开发网站问题