【问题标题】:LightOpenID authentication using POST method使用 POST 方法的 LightOpenID 身份验证
【发布时间】:2011-02-09 14:55:34
【问题描述】:

有没有办法通过 POST 方法使用 LightOpenID 库进行身份验证?确切地说,在通过身份验证后,谷歌(例如)返回到指定的 URL,但所有数据都是使用 GET 方法发送给我的,结果是丑陋而长的 URL。

我的代码是:

define('BASE_URL', 'http://someurl.com');

try {
    $openid = new LightOpenID();

    if (!isset($_GET['openid_mode'])) {
        // no openid mode was set, authenticate user
        $openid->identity = 'https://www.google.com/accounts/o8/id';
        $openid->realm = BASE_URL;
        $openid->required = array('contact/email');

        header('Location: '.$openid->authUrl());

    } else if ($_GET['openid_mode'] == 'cancel') {
        // user canceled login, redirect them
        header('Location: '.BASE_URL);

    } else {
        // authentication completed, perform license check
        if ($openid->validate()) {
            $openid->getAttributes();
        }
    }

} catch (ErrorException $e) {

}

因此,在身份验证 OP 返回到如下所示的 url 后:

http://someurl.com/index.php?openid.ns=http://specs.openid.net/auth/2.0&openid.mode=id_res&openid.op_endpoint=https://www.googl...

我希望 OP 返回:

http://someurl.com/index.php

并使用 POST 而不是 GET 发送所有数据。

【问题讨论】:

  • 如果您主要关心的是 URL 看起来不错,只需在获取所有数据后让您的端点重定向到正常的东西。虽然 LOID 支持 POST,但我怀疑每个 OID 提供程序都非常灵活。
  • 嗯,我认为谷歌应该支持它。如何在 LOID 中指定使用 POST?

标签: php post openid lightopenid


【解决方案1】:

我一直在做同样的事情。请参阅下面的代码。我认为这应该会有所帮助。

<?php 
require 'lightopenid/openid.php';
try {
    $openid = new LightOpenID;                       
    if(!$openid->mode) {
        if(isset($_GET['login'])) {
            $openid->identity = 'https://www.google.com/accounts/o8/site-xrds?hd=yourdomain.com';         
        $openid->required = array('namePerson/friendly', 'contact/email' , 'contact/country/home', 'namePerson/first', 'pref/language', 'namePerson/last'); 
            header('Location: ' . $openid->authUrl());    
        }
?>
<form action="?login" method="post">
    <button>Login with Google</button>
</form>
<?php
    } elseif($openid->mode == 'cancel') {
        echo 'User has canceled authentication !';
    } else {
        session_start();
        $fname = $openid->ret_fname();                        // setting session
        $lname = $openid->ret_lname();                        // setting session
        $email = $openid->ret_email();                        // setting session
        $_SESSION['admin']['name'] = $fname.' '.$lname;       // setting session
        $_SESSION['admin']['emailID'] = $email;               // setting session

        header('Location:approve.php');  // PUT YOUR PAGE/URL HERE.... I THINK THIS SHOULD DO THE TRICK !!! 
    }
} catch(ErrorException $e) {
    echo $e->getMessage();
}

【讨论】:

  • 那么这是否会在用户登录后使用 POST 方法而不是 GET 方法返回所有数据?
  • $fname = $openid-&gt;ret_fname(); $lname = $openid-&gt;ret_lname(); $email = $openid-&gt;ret_email(); 您将在这些 php 变量中获得 fname、lname、email 的所有值。现在您可以随心所欲地使用它们。我更喜欢在你的会话中设置它们。
【解决方案2】:

有可能是不可能的,根据这个问题的最高答案:Response.Redirect with POST instead of Get?

不过,Google 向您的页面处理程序返回的身份验证响应可能是“请求”而不是“重定向”,所以我仍然不确定。

在响应后使用上述 POST 重定向自己似乎是一个很好的解决方法。

另一种解决方案可能是使用 AJAX 隐藏整个过程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-14
    • 2010-10-24
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    相关资源
    最近更新 更多