Clean Magento Google Api OAuth2 Integration


Clean Magento Google Api OAuth2 Integration

简述问题:在Magento中为管理区域实施Google Api OAuth2身份验证的最干净方法

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

过程很简单

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

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

让我们具体一点。 它检索谷歌联系人。 到目前为止,我有:

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

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

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

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

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

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

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

此前端控制器操作存储访问令牌,我重定向回adminhtml_contacts/索引操作。 由于上面指定的"key"url参数跨站点请求伪造保护问题,它仍然失败。

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

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

它并不理想,但有效,意味着我实际上可以开始在 api 上工作,而不是弄乱身份验证。

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