穿越黑暗之门-跨域认证
时间:2007-02-17 来源:PHP爱好者
BTW:“穿越黑暗之门”,引自WOW。
呵呵,言归正传。看到最近不少人谈起跨域认证的话题,下面就我的一些浅薄认识谈谈这个问题,欢迎各
位用$砸死我.
用户D访问域A,域A收集用户信息,使用方法createSession()告诉认证服务器C:用户D要来访问了,他希望跳转到哪个页面,需要将哪些信息一并给他传送过去,并且返回接口的位置.认证服务器C收到信息后进行处理(使用一种自己的加密规则加密),然后生成一个唯一令牌,返回给域A的接口.域A的接口收到这个令牌后,调用C的checkSession()方法,询问C这个令牌是否合法且有效,C返回答案给A说:OK,没问题,这家伙是合法的,然后马上把这个令牌销毁.域A收到OK后,通过用户D在本地的认证.
一段时间过去了,用户D感觉到域A不爽了,于是他想到域B去逛逛.于是,他点击了一个到B的URL地址,域A一看这小子要走了,马上告诉C,这小子想上域B了,域B的接口请做好准备.C控制器收到信息后再进行处理,生成一个唯一令牌返回给域B,域B的接口收到请求后,调用C的checkSession()检查这个令牌是否合法且有效.C检查后告诉B说:没问题,放行吧,然后再把这个令牌干掉.于是,用户D就这样通过了B的认证了.
不知道这样说大家是不是很明白.这中间,我没有告诉你,你的认证服务器应该用C还是java,接口用xmlrpc还是soap还是其他的,数据库用db2还是mysql,实现细节等,因为这些都不是本贴的重点.
欢迎指正.
imbiss 回复于:2005-09-07 21:44:40 当用户D要从域A转到域B的时候,域A是如何察觉的?
tomac 回复于:2005-09-07 21:58:50 我看跨域认证,最重要的不是通知,而是认证,对唯一令牌的认证与发放
tonera 回复于:2005-09-07 22:14:37 [quote:e47fc91ab4="imbiss"]当用户D要从域A转到域B的时候,域A是如何察觉的?[/quote:e47fc91ab4]
域A到域B有个链接,这个链接目标是域B的认证入口.参数是域A去C领取的令牌.
如果你想用户D不通过链接直接输入URL地址实现跨域,那是另外一回事.
imbiss 回复于:2005-09-07 22:21:23 那令牌是不是seesion? 为什么要销毁?唯一的令牌传递下去不是更好?
geel 回复于:2005-09-07 23:11:56 必须要做一个连接ABC域的G域,ABC之间来回走动都要通过G域,也就是用户D想要串门的话必须到G领护照
用户令牌怎么说呢,可以理解成是用户信息或者什么信息+唯一密钥产生的一个摘要,对用户来说没什么用,是两个域之间验证来源用的
假设认证权威域为A,使用认证的域为B,流程就是:
1. 用户先到A,A根据用户信息和其他信息产生一个唯一令牌,存储下来,通知用户转到B
2. B从用户那里得到令牌
3. B把这个令牌信息发送到A,请求确认
4. A向B确认令牌(确认或否定)
5. B根据A的确认信息通过验证或拒绝
知道为什么要销毁令牌信息了吧。
不过牛粪,假如没有中转域A,怎么认证呢
tonera 回复于:2005-09-08 10:31:36 [quote:3a5708f64b="imbiss"]那令牌是不是seesion? 为什么要销毁?唯一的令牌传递下去不是更好?[/quote:3a5708f64b]
不是session,这里的令牌是由认证服务器C生成的唯一标识信息。 它能标识是哪个用户在访问,这个用户将要到哪个地方,要去的地方的入口在哪里,还有用户额外需要附加的信息。
令牌只可使用一次,所以要及时销毁,否则的话,就没有安全性可言了。
tonera 回复于:2005-09-08 10:35:33 [quote:db7ed43b56="geel"]假设认证权威域为A,使用认证的域为B,流程就是:
......
不过牛粪,假如没有中转域A,怎么认证呢.....[/quote:db7ed43b56]
你已经说了。认证权威域为A,如果没有A,那就是说:没有认证服务器,没有认证服务器的话,当然不可能实现跨域认证。
gydoesit 回复于:2005-09-08 20:02:22 为什么要通知B?
直接在地址栏输入B的地址会如何?
dualface 回复于:2005-09-09 03:32:22 必然要有一个认证服务器的。
只是“域A一看这小子要走了,马上告诉C,这小子想上域B了,域B的接口请做好准备.”这个,明显不实用。用户要访问a网站就访问a网站,例如输入 www.a.com。要访问b网站也不能说非得从a网站上的连接点过去吧,输入 www.b.com 就行了。
tonera 回复于:2005-09-09 09:11:31 [quote:9f89835d59="dualface"]必然要有一个认证服务器的。
只是“域A一看这小子要走了,马上告诉C,这小子想上域B了,域B的接口请做好准备.”这个,明显不实用。用户要访问a网站就访问a网站,例如输入 www.a.com。要访问b网站也不能说非得从a网站..........[/quote:9f89835d59]
是这样的,所有从一个域到另外一个域的访问,都要先从认证服务器那里领取令牌,然后把这个令牌作为URL[b:9f89835d59]参数[/b:9f89835d59]生成一个指向目标域的入口[/color:9f89835d59]的链接,目标域的入口收到这个令牌后向认证服务器请求验证.事实上国内很多的passport实现方案都是这个方法.
你说的,www.a.com访问www.b.com,直接输入地址的过程是另外一回事.或者说是另外一种跨域认证的解决方案.
php爱好者站 http://www.phpfans.net php基础|php进阶|php模板.
呵呵,言归正传。看到最近不少人谈起跨域认证的话题,下面就我的一些浅薄认识谈谈这个问题,欢迎各
位用$砸死我.
用户D访问域A,域A收集用户信息,使用方法createSession()告诉认证服务器C:用户D要来访问了,他希望跳转到哪个页面,需要将哪些信息一并给他传送过去,并且返回接口的位置.认证服务器C收到信息后进行处理(使用一种自己的加密规则加密),然后生成一个唯一令牌,返回给域A的接口.域A的接口收到这个令牌后,调用C的checkSession()方法,询问C这个令牌是否合法且有效,C返回答案给A说:OK,没问题,这家伙是合法的,然后马上把这个令牌销毁.域A收到OK后,通过用户D在本地的认证.
一段时间过去了,用户D感觉到域A不爽了,于是他想到域B去逛逛.于是,他点击了一个到B的URL地址,域A一看这小子要走了,马上告诉C,这小子想上域B了,域B的接口请做好准备.C控制器收到信息后再进行处理,生成一个唯一令牌返回给域B,域B的接口收到请求后,调用C的checkSession()检查这个令牌是否合法且有效.C检查后告诉B说:没问题,放行吧,然后再把这个令牌干掉.于是,用户D就这样通过了B的认证了.
不知道这样说大家是不是很明白.这中间,我没有告诉你,你的认证服务器应该用C还是java,接口用xmlrpc还是soap还是其他的,数据库用db2还是mysql,实现细节等,因为这些都不是本贴的重点.
欢迎指正.
imbiss 回复于:2005-09-07 21:44:40 当用户D要从域A转到域B的时候,域A是如何察觉的?
tomac 回复于:2005-09-07 21:58:50 我看跨域认证,最重要的不是通知,而是认证,对唯一令牌的认证与发放
tonera 回复于:2005-09-07 22:14:37 [quote:e47fc91ab4="imbiss"]当用户D要从域A转到域B的时候,域A是如何察觉的?[/quote:e47fc91ab4]
域A到域B有个链接,这个链接目标是域B的认证入口.参数是域A去C领取的令牌.
如果你想用户D不通过链接直接输入URL地址实现跨域,那是另外一回事.
imbiss 回复于:2005-09-07 22:21:23 那令牌是不是seesion? 为什么要销毁?唯一的令牌传递下去不是更好?
geel 回复于:2005-09-07 23:11:56 必须要做一个连接ABC域的G域,ABC之间来回走动都要通过G域,也就是用户D想要串门的话必须到G领护照
用户令牌怎么说呢,可以理解成是用户信息或者什么信息+唯一密钥产生的一个摘要,对用户来说没什么用,是两个域之间验证来源用的
假设认证权威域为A,使用认证的域为B,流程就是:
1. 用户先到A,A根据用户信息和其他信息产生一个唯一令牌,存储下来,通知用户转到B
2. B从用户那里得到令牌
3. B把这个令牌信息发送到A,请求确认
4. A向B确认令牌(确认或否定)
5. B根据A的确认信息通过验证或拒绝
知道为什么要销毁令牌信息了吧。
不过牛粪,假如没有中转域A,怎么认证呢
tonera 回复于:2005-09-08 10:31:36 [quote:3a5708f64b="imbiss"]那令牌是不是seesion? 为什么要销毁?唯一的令牌传递下去不是更好?[/quote:3a5708f64b]
不是session,这里的令牌是由认证服务器C生成的唯一标识信息。 它能标识是哪个用户在访问,这个用户将要到哪个地方,要去的地方的入口在哪里,还有用户额外需要附加的信息。
令牌只可使用一次,所以要及时销毁,否则的话,就没有安全性可言了。
tonera 回复于:2005-09-08 10:35:33 [quote:db7ed43b56="geel"]假设认证权威域为A,使用认证的域为B,流程就是:
......
不过牛粪,假如没有中转域A,怎么认证呢.....[/quote:db7ed43b56]
你已经说了。认证权威域为A,如果没有A,那就是说:没有认证服务器,没有认证服务器的话,当然不可能实现跨域认证。
gydoesit 回复于:2005-09-08 20:02:22 为什么要通知B?
直接在地址栏输入B的地址会如何?
dualface 回复于:2005-09-09 03:32:22 必然要有一个认证服务器的。
只是“域A一看这小子要走了,马上告诉C,这小子想上域B了,域B的接口请做好准备.”这个,明显不实用。用户要访问a网站就访问a网站,例如输入 www.a.com。要访问b网站也不能说非得从a网站上的连接点过去吧,输入 www.b.com 就行了。
tonera 回复于:2005-09-09 09:11:31 [quote:9f89835d59="dualface"]必然要有一个认证服务器的。
只是“域A一看这小子要走了,马上告诉C,这小子想上域B了,域B的接口请做好准备.”这个,明显不实用。用户要访问a网站就访问a网站,例如输入 www.a.com。要访问b网站也不能说非得从a网站..........[/quote:9f89835d59]
是这样的,所有从一个域到另外一个域的访问,都要先从认证服务器那里领取令牌,然后把这个令牌作为URL[b:9f89835d59]参数[/b:9f89835d59]生成一个指向目标域的入口[/color:9f89835d59]的链接,目标域的入口收到这个令牌后向认证服务器请求验证.事实上国内很多的passport实现方案都是这个方法.
你说的,www.a.com访问www.b.com,直接输入地址的过程是另外一回事.或者说是另外一种跨域认证的解决方案.
php爱好者站 http://www.phpfans.net php基础|php进阶|php模板.
相关阅读 更多 +