OpenId 组件:使用 CakePHP 从 Google 获取属性

Posted

技术标签:

【中文标题】OpenId 组件:使用 CakePHP 从 Google 获取属性【英文标题】:OpenId Component: getting attributes back from Google using CakePHP 【发布时间】:2012-05-07 03:56:08 【问题描述】:

有没有我可以使用 Cakephp 和 OpenID 组件从 Google 成功获取 OpenId 用户属性(如姓名、电子邮件)的示例?当我尝试添加所需参数时,我收到“您请求的页面无效”。

更多细节

组件:http://code.42dh.com/openid/

如果我不请求任何“属性”,它就可以正常工作。当我尝试按照以下示例添加对必需/可选属性的请求时,我从 Google 收到错误消息:“您请求的页面无效。”

示例(不适用于我):http://cakebaker.42dh.com/2008/02/12/using-the-openid-simple-registration-extension/

根据1个来源,问题是:

该错误实际上是由不包括 openid.claimed_id 和 openid.identity 参数,必须设置为 “http://specs.openid.net/auth/2.0/identifier_select”。有了这些套装, 我收到另一个错误,也可以通过填写来解决 openid.realm,与openid.return_to的值相同。

Google OpenID: the page you requested is invalid

代码

function openidlogin() 

    $realm = 'http://' . $_SERVER['HTTP_HOST'];
    $returnTo = $realm . '/users/openidlogin';


    $url = "https://www.google.com/accounts/o8/id";
    if ($this->RequestHandler->isPost() && !$this->Openid->isOpenIDResponse()) 
        try 
            $this->Openid->authenticate($url, $returnTo, $realm); // WORKS !!!
            $this->Openid->authenticate($url, 'http://'.$_SERVER['SERVER_NAME'].'/users/login', 'http://'.$_SERVER['SERVER_NAME'], array('email'), array()); // FAILS
         catch (InvalidArgumentException $e) 
            $this->Session->setFlash("Error: Invalid OpenId");
         catch (Exception $error) 
            $this->Session->setFlash("Error: " + $error->getMessage());
        
     elseif ($this->Openid->isOpenIDResponse()) 

        $response = $this->Openid->getResponse($returnTo);

        if ($response->status == Auth_OpenID_CANCEL) 
            $this->Session->setFlash("Google Login Cancelled");
            $this->redirect(array("controller" => "users", "action" => "login"));
         elseif ($response->status == Auth_OpenID_FAILURE) 
            $this->Session->setFlash("Veficiation Failed: " . $response->message);
            $this->redirect(array("controller" => "users", "action" => "login"));
         elseif ($response->status == Auth_OpenID_SUCCESS) 

            $axResponse = Auth_OpenID_AX_FetchResponse::fromSuccessResponse($response);
            debug ($response);
            debug ($axResponse);
            $this->Session->setFlash("Authenticated");
        
    

【问题讨论】:

【参考方案1】:

看看下面的例子:https://github.com/cakebaker/openid-component-example/blob/master/app/Controller/UsersController.php

【讨论】:

我很好奇——你是怎么想出那个代码的?您是否已经熟悉 php 的 OpenID 库? @Utkarsh:是的,我是 CakePHP 的 OpenID 组件的作者,它基于 PHP 的 OpenID 库。

以上是关于OpenId 组件:使用 CakePHP 从 Google 获取属性的主要内容,如果未能解决你的问题,请参考以下文章

我可以从哪里下载 cakephp 电子邮件组件?

在 CakePHP 中使用控制器之外的组件

CakePHP 设置用于从组件发送电子邮件的数据

Cakephp 在帮助器中调用组件方法

CakePHP 使用来自 Shell cronjob 的电子邮件组件

无法将供应商类导入 CakePHP 2.5.1 中的组件