2

我正在使用 LightOpenID,虽然它很轻,但它不是很容易理解,而且它没有 wiki...

他们提供的示例文件如下(对不起,拉长的帖子),我不明白为什么它两次实例化 LightOpenID?

require 'openid.php';
try {

    if(!isset($_GET['openid_mode'])) {  // what is this about?

        if(isset($_POST['openid_identifier'])) {

            $openid = new LightOpenID;

            $openid->identity = $_POST['openid_identifier'];

            header('Location: ' . $openid->authUrl());
        }
?>
<form action="" method="post">
    OpenID: <input type="text" name="openid_identifier" /> <button>Submit</button>
</form>
<?php
    } elseif($_GET['openid_mode'] == 'cancel') {
        echo 'User has canceled authentication!';
    } else {
        $openid = new LightOpenID;
        echo 'User ' . ($openid->validate() ? $openid->identity . ' has ' : 'has not ') . 'logged in.';

    }
} catch(ErrorException $e) {
    echo $e->getMessage();
}

如果有人真的觉得有帮助,我会尝试将其添加到我现有的脚本中。我怎样才能做到当 $openid->validate() 返回 true 时,我可以将 $sql_answer 保存到数据库中?

4

2 回答 2

3

在 OpenID 中,需要跨相关方执行多个请求才能完成登录过程;单一的互动是不够的。进一步来说:

  1. 浏览器要求登录页面,您发送表单(openid_identifier 和 openid_mode 均未设置)。
  2. 用户填写openid,提交。您需要与提供者开始交易,重定向用户(设置了表单中的 openid_identifier,但未设置 openid_mode)
  3. 用户被重定向到提供者,登录,并且提供者重定向回您的页面。您需要验证返回的数据是否真实,然后使用标识符实际登录用户(例如建立会话、更新 UI 等)(openid_mode 将设置为“id_res”、“cancel”或“error” )。

所以 LightOpenID 的两个实例化实际上属于情况 2 和 3 的独立 HTTP 请求;在第一种情况下,您不需要 LightOpenID 对象,因为您正在显示静态表单。

于 2010-11-07T23:42:18.373 回答
2

他们提供了一个 wiki:http ://code.google.com/p/lightopenid/w/list

不可能使用您的脚本创建两个 OpenID 对象。如果你不喜欢$openid = new LightOpenID;在你的脚本中出现两次,就写一遍if(isset($_POST['openid_identifier'])) {

于 2011-01-17T13:58:22.243 回答