【问题标题】:Clean Magento Google Api OAuth2 Integration清理 Magento Google Api OAuth2 集成
【发布时间】:2013-01-13 14:56:33
【问题描述】:

简短的问题: 在 Magento 中为管理区域实施 Google Api OAuth2 身份验证的最简洁方法是什么

长问题: 所有新的 Google API 都使用 OAuth2。 php 客户端库在这里,它抽象了 OAuth2 处理 https://code.google.com/p/google-api-php-client/

过程很简单

  • 用户是否有 AccessToken?
  • 没有
  • 好的,使用客户端库创建登录网址
  • 用户点击登录 url 链接将他们带到 Google 登录
  • 经过身份验证后,Google 会通过指定的重定向 url 重定向回 Magento
  • Google 将 AccessToken 作为 url 的一部分发回。存储它。
  • 使用此 AccessToken 调用各种 API

客户端库中的示例都是平面文件。因此,我正在寻找将其放入 MVC 结构的最佳方法......或者准确地说是 Magento。

让我们具体一点。它检索谷歌通讯录。到目前为止,我有:

  • 一个名为 ContactsController 的管理控制器,具有索引操作。它做的第一件事是检查是否有访问令牌。如果没有访问令牌,它将转发到身份验证操作。
  • auth 操作只是呈现一个块,该块具有由 google php 客户端库“createAuthUrl()”生成的 AuthUrl
  • 点击链接后,谷歌登录页面加载,我登录
  • Google 重定向回我在代码中指定的 URL(以及 Google API 控制台https://code.google.com/apis/console)。他们还传回访问令牌。此 URL 必须是可预测的,因此它不能是管理区域 url,因为它们依赖于“key”url 参数。因此,我为 Google 创建了一个前端控制器和操作以重定向回。
  • 我在前端控制器中存储了 AccessToken。
  • 然后我重定向回管理控制器 ContactsController 索引操作。它看到一个 AccessToken 并且应用程序实际上可以做一些事情。

我的问题是我无法进行最终重定向。即使我使用了 adminhtml 助手 getUrl 方法,它确实附加了“key”url 参数,但当我从前端重定向到后端时,我被踢到了仪表板。

有没有更好的方法在 Magento 中实现 Googles OAuth2?

如何重定向到直接的管理员 URL?

【问题讨论】:

  • 刚刚做了一些测试。管理员重定向确实按预期工作,但不适用于自定义模块。因此,对于标准管理页面,如编辑产品,以下内容适用于任何控制器操作(前端或后端)$redirectUrl = Mage::helper("adminhtml")->getUrl("adminhtml/catalog_product/edit/", array('id'=>38)); $this->_redirectUrl($redirectUrl); 但自定义模块路由/控制器/操作管理 url 只是将我踢到仪表板。很烦$redirectUrl = Mage::helper("adminhtml")->getUrl("mymodule_admin/adminhtml_contacts/index/"); $this->_redirectUrl($redirectUrl);
  • 您是否能够完成 Google API OAuth2 Magento 集成?看起来仍然没有太多东西。
  • 没有。我刚刚使用 Google APIs Client Library for PHP github.com/google/google-api-php-client 一起破解了一些东西。我使用 Google_Client::setScopes 访问我需要的 API,将 Google_Client::setAccessType 设置为“离线”,将 Google_Client::setApprovalPrompt 设置为“强制”,然后在身份验证过期时使用刷新令牌。它并不漂亮,但是一旦我完成了一次登录和批准,我就会重复调用相关的 API。请看下面我的回答。这对我有用,因为我使用的 API 调用只是在后台运行。恐怕您需要卷起袖子使用 OAuth2

标签: php magento google-api oauth-2.0 google-api-client


【解决方案1】:

仅呈现登录链接的整个身份验证操作毫无意义。

一旦 adminhtml_contacts/index 操作意识到没有访问令牌,它就可以使用 Google_Client::createAuthUrl 来确定应该将用户发送到哪里。那么为什么要麻烦把它放到一个实际的链接中呢?相反,我只是立即将它们重定向到 authUrl。

如果用户已经登录谷歌,那么他们不需要做任何事情。 Google 看到他们已登录并立即重定向回我指定的(且可预测的)前端控制器操作。

此前端控制器操作存储访问令牌,我重定向回 adminhtml_contacts/index 操作。由于上面指定的 'key' url 参数跨站请求伪造保护问题,它仍然无法正常工作。

为了解决这个问题,我使用管理控制器中的 preDispatch 挂钩关闭了此操作的密钥。

public function preDispatch()
{ 
     if ($this->getRequest()->getActionName() == 'index') Mage::getSingleton('adminhtml/url')->turnOffSecretKey();
     parent::preDispatch();
}

它并不理想,但很有效,这意味着我实际上可以开始处理 api 而不是乱搞身份验证。

现在要掌握没有客户端抽象的 Contacts API,因此我必须深入研究 SimpleXml 命名空间问题和繁琐的 DOMDocument 操作。嘿嘿。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 2015-06-10
    • 1970-01-01
    • 2013-05-02
    • 2015-06-26
    • 2014-05-25
    • 1970-01-01
    相关资源
    最近更新 更多