简短的问题: 在管理区域的 Magento 中实现 Google Api OAuth2 身份验证的最干净的方法是什么
详细问题: 所有新的 Google API 都使用 OAuth2。 php 客户端库在这里,它抽象了 OAuth2 处理 https://code.google.com/p/google-api-php-client/
过程很简单
- 用户是否有 AccessToken?
- 没有
- 好的,使用客户端库创建一个登录 url
- 用户点击登录 url 链接,将他们带到 Google 进行登录
- 一旦通过身份验证,Google 就会通过指定的重定向 URL 重定向回 Magento
- Google 发回一个 AccessToken 作为 url 的一部分。存储它。
- 使用此 AccessToken 调用各种 API
客户端库中的示例都是平面文件。因此,我正在寻找将其融入 MVC 结构的最佳方式……或者准确地说是 Magento。
让我们具体一点。它用于检索 Google 联系人。到目前为止,我有:
- 名为 ContactsController 的管理 Controller ,带有索引操作。它做的第一件事是检查是否有访问 token 。如果没有访问 token ,它会转发到身份验证操作。
- auth 操作只是呈现一个 block ,该 block 具有由 google php 客户端库“createAuthUrl()”生成的 AuthUrl
- 点击链接后,谷歌登录页面加载,我登录
- Google 重定向回我在代码中指定的 URL(以及 Google API 控制台 https://code.google.com/apis/console)。他们还传回访问 token 。此 URL 必须是可预测的,因此它不能是管理区域 url,因为它们依赖于“关键”url 参数。因此,我为 Google 重定向回创建了一个前端 Controller 和操作。
- 在前端 Controller 中,我存储了 AccessToken。
- 然后我重定向回管理 Controller ContactsController 索引操作。它看到一个 AccessToken,应用程序实际上可以做一些事情。
我遇到的问题是我无法执行最终重定向。即使我使用的是 adminhtml 帮助器 getUrl 方法,它确实附加了“key”url 参数,但当我从前端重定向到后端时,我会被踢到仪表板。
有没有更好的方法在 Magento 中实现 Googles OAuth2?
如何重定向到直接管理 URL?
最佳答案
仅呈现登录链接的整个身份验证操作毫无意义。
一旦 adminhtml_contacts/index 操作意识到没有访问 token ,它就可以使用 Google_Client::createAuthUrl 来确定应该将用户发送到哪里。那么为什么要把它放到一个实际的链接中呢?相反,我只是立即将它们重定向到 authUrl。
如果用户已经登录到 google,那么他们不需要做任何事情。 Google 看到他们已登录并立即重定向回我指定的(和可预测的)前端 Controller 操作。
此前端 Controller 操作存储访问 token ,我重定向回 adminhtml_contacts/index 操作。由于上面指定的 'key' url 参数跨站点请求伪造保护问题,它仍然失败。
为了解决这个问题,我使用管理 Controller 中的 preDispatch Hook 仅为此操作关闭了 key 。
public function preDispatch()
{
if ($this->getRequest()->getActionName() == 'index') Mage::getSingleton('adminhtml/url')->turnOffSecretKey();
parent::preDispatch();
}
它不理想但有效,意味着我实际上可以开始使用 api 而不是乱搞身份验证。
现在要掌握没有客户端抽象的联系人 API,所以我必须深入研究 SimpleXml 命名空间问题和繁琐的 DOMDocument 操作。嘿嘿。
关于php - 清理 Magento Google Api OAuth2 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14593056/