随笔 - 170  文章 - 536  trackbacks - 0
<2007年8月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

我参与的团队

随笔分类(103)

搜索

  •  

积分与排名

  • 积分 - 412666
  • 排名 - 135

最新评论

阅读排行榜

因为有一个 Struts2 网站发布,需要整合一个论坛来使用,公司的一个项目过去曾经整合过一个英文论坛,但似乎不能满足我们的需求,需要找一个成熟稳定的中文论坛,与我们的系统结合。

最终选择了 Discuz 作为我们的论坛系统,主要是因为它提供了一套可用的 Passport API,来直接与我们现有系统进行整合。

下面摘录 Discuz 文档中的内容来说明整合原理,随后的几篇中,将详细描述具体的整合过程。

假设已设置如下变量或参数

  • 挂接 Discuz! Passport 的应用程序假设为一套 PHP 语言编写的 CMS 系统
  • Discuz! 的 URL 为 http://www.myforums.com
  • 应用程序的 URL 为 http://www.mywebsite.com
  • 应用程序的注册页面为 http://www.mywebsite.com/register.php
  • 应用程序的登录页面为 http://www.mywebsite.com/login.php?action=login
  • 应用程序的退出页面为 http://www.mywebsite.com/login.php?action=logout

开启通行证后的用户登录流程

  • 如果用户在论坛点击“登录”,则转向到事先设置好的应用程序登录页面(http://www.mywebsite.com/login.php?action=login),并在登录页面的 URL 中加入参数 forward(加入 forward 后的链接例如 http://www.mywebsite.com/login.php?action=login&forward=http://www.myforums.com/index.php),用于在登录后将用户导向到指定的 URL。

  • 应用程序收到此请求后,按照惯例生成表单,并增加一个表单变量,将 GET 方式传递过来的 forward 参数通过表单进行传递。

  • 用户在应用程序的表单中填写登录信息,并提交到应用程序的登录验证程序。应用程序验证用户提交的用户名和密码的合法性:

    • 如果不通过:提示用户名密码错误,要求其返回上一页重新填写。

    • 如果通过,需要进行如下操作:

      • 设置自身 Cookie 或 Session,使得应用程序自身处于登录状态。

      • 检查表单中是否提交了 forward 变量,如有,则意味着登录请求可能是由论坛而来,将此变量传递到后面的请求中。如没有,自行生成 forward 变量,使得论坛登录后能够跳转回到应用程序中。

      • 通过 header('Location: http://www.myforums.com/api/passport.php?action=login&auth=xxx&forward=http://yyy&verify=zzz') 的方式,将登录请求传递到论坛进行处理。其中 auth 用来将用户信息与资料以特定的格式,加密传递给论坛,forward 用于告知论坛 Passport API 完成自身操作后转向到的 URL 地址,verify 用于验证前面两个变量的有效性。auth、forward、verify 格式与结构将在后面进行说明。


  • Discuz! Passport API 在接收到由应用程序通过 header() 提交过来的请求后,进行如下操作:

    • 根据 verify 判断 auth 和 forward 变量是否合法,如合法则继续,否则终止。

    • 将 auth 根据既定算法解密,并还原成数组,数组的内容与格式将在后面进行说明。根据数组中的内容,检查此用户是否存在。如存在,则根据上述数组中的内容 UPDATE 论坛中相应的用户资料。如不存在,则使用数组中的信息 INSERT 到论坛用户资料表中。

    • 论坛设置 Cookie 或 Session,使得论坛自身处于登录状态。

    • 根据应用程序反馈的 forward 值,通过 header('Location: http://xxx') 的形式将页面跳转到 forward 变量指定的 URL。


  • 至此,登录流程结束

开启通行证后的用户退出流程

  • 如果用户在论坛点击“退出”,则转向到事先设置好的应用程序退出页面(http://www.mywebsite.com/login.php?action=logout),并在登录页面的 URL 中加入参数 forward(例如 http://www.mywebsite.com/login.php?action=login&forward=http://www.myforums.com/index.php),用于在退出后将用户导向到指定的 URL。

  • 应用程序收到此请求后,清除自身 Cookie 或 Session,使得应用程序自身处于非登录状态。

  • 检查是否提交了 forward 变量,如有,则意味着登录请求可能是由论坛而来,将此变量传递到后面的请求中。如没有,自行生成 forward 变量,使得论坛登录后能够跳转回到应用程序中

  • 通过 header('Location: http://www.myforums.com/api/passport.php?action=logout&forward=http://yyy&verify=zzz') 的方式,将退出请求传递到论坛进行处理。其中 forward 用于告知论坛 Passport API 完成自身操作后转向到的 URL 地址,verify 用于验证 forward 变量的有效性。forward、verify 格式与结构将在后面进行说明

  • Discuz! Passport API 在接收到由应用程序通过 header() 提交过来的请求后,进行如下操作:

    • 根据 verify 判断 forward 变量是否合法,如合法则继续,否则终止。

    • 清楚论坛的 Cookie 或 Session,使得论坛自身处于非登录状态。

    • 根据应用程序反馈的 forward 值,通过 header('Location: http://xxx') 的形式将页面跳转到 forward 变量指定的 URL。


  • 至此,退出流程结束。

开启通行证后的用户注册流程

  • 如果用户在论坛点击“注册”,则转向到事先设置好的应用程序注册页面(http://www.mywebsite.com/register.php),并在注册页面的 URL 中加入参数 forward(例如 http://www.mywebsite.com/register.php?forward=http://www.myforums.com/index.php),用于在注册后将用户导向到指定的 URL

  • 应用程序收到此请求后,按照惯例生成表单,并增加一个表单变量,将 GET 方式传递过来的 forward 参数通过表单进行传递

  • 用户在应用程序的表单中填写注册信息,并提交到应用程序的注册验证程序。应用程序验证用户提交信息的完整性和合法性:

    • 如果不通过:提示其问题所在,要求其返回上一页重新填写

    • 如果通过,需要进行如下操作:

      • 将用户资料插入到应用程序自身用户数据库中

      • 设置自身 Cookie 或 Session,使得应用程序自身处于登录状态

      • 检查表单中是否提交了 forward 变量,如有,则意味着注册请求可能是由论坛而来,将此变量传递到后面的请求中。如没有,自行生成 forward 变量,使得论坛注册后能够跳转回到应用程序中

      • 通过 header('Location: http://www.myforums.com/api/passport.php?action=login&auth=xxx&forward=http://yyy&verify=zzz') 的方式,将注册请求传递到论坛进行处理。其中 auth 用来将用户信息与资料以特定的格式,加密传递给论坛,forward 用于告知论坛 Passport API 完成自身操作后转向到的 URL 地址,verify 用于验证前面两个变量的有效性。auth、forward、verify 格式与结构将在后面进行说明


  • Discuz! Passport API 在接收到由应用程序通过 header() 提交过来的请求后,进行如下操作:

    • 根据 verify 判断 auth 和 forward 变量是否合法,如合法则继续,否则终止

    • 将 auth 根据既定算法解密,并还原成数组,数组的内容与格式将在后面进行说明。根据数组中的内容,检查此用户是否存在。如存在,则根据上述数组中的内容 UPDATE 论坛中相应的用户资料。如不存在,则使用数组中的信息 INSERT 到论坛用户资料表中

    • 论坛设置 Cookie 或 Session,使得论坛自身处于登录状态

    • 根据应用程序反馈的 forward 值,通过 header('Location: http://xxx') 的形式将页面跳转到 forward 变量指定的 URL


  • 至此,注册流程结束

    本部分中,加下划线显示的部分,是需要对您的应用程序进行更改的部分,事实上,这部分更改会非常容易和方便。

posted on 2007-08-11 17:30 steady 阅读(3278) 评论(3)  编辑  收藏 所属分类: Java

FeedBack:
# re: Struts2 整合 Discuz 论坛 (1) 2008-09-05 16:59 jackyrong
有第2部分的文么?  回复  更多评论
  
# re: Struts2 整合 Discuz 论坛 (1) 2008-11-12 10:19 thk
这只是官方的Discuz! Passport copy来的啊
请问博主有续集讲解吗?  回复  更多评论
  
# re: Struts2 整合 Discuz 论坛 (1) 2011-03-27 14:09 openjweb
我最关系的是这句:

将 auth 根据既定算法解密

请问怎么解密?uc.php中,dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);后,得到cookie值还原不出来用户名和密码。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: