如何将OAuth与Google日历一起使用来只访问一个日历?

问题描述:

我建立了一个客户的Web应用程序,我真的不知道我在做正确的事...如何将OAuth与Google日历一起使用来只访问一个日历?

基本上,我创建了一个读取,编辑PHP应用程序,谷歌上删除日历和在我自己的Web应用程序数据库上保留一份副本(出于各种原因)。现在,我了解了OAuth 2.0,并意识到使用它可能比我的客户端普通Google密码(可以直接在我的Web应用程序中访问所有的Google服务(日历,电子邮件等))更安全,话说,如果一个黑客进入服务器比他可以窃取她的密码...)。

所以我建立的OAuth 2.0帐户,从http://code.google.com/apis/calendar/v3/using.html#setup此页面中添加类/文件夹,并添加适当的脚本测试页“授权访问您的信息” (see "Instantiating the client " in the same page)上...

这里是我的问题:如果我使用我的登录信息(而不是我的客户端)登录了我的Gmail,并且进入我的测试页面,它会要求我授权访问我的Google日历。但我想要我的客户的日历,而不是我的!所以,让我们假装我注销,使用我的客户信息登录并进入测试页面:这非常完美,我授权帐户,然后我重定向到我的应用程序,在那里我可以看到她的日历。

但是这不符合逻辑......因为,例如,我希望她的GENERAL PUBLIC网站上的人员登录一个页面并填写表格以便自动执行约会。该脚本必须检查她的谷歌日历....并要求他们的Gmail帐户的权限?不,我想要她的日历。

所以这是我的问题/问题。我究竟做错了什么?这是正确的方式吗?还是我错过了一个步骤?这个API意味着做到这一点吗?

如何使用API​​以上述方式工作?

感谢所有,点燃我的蜡烛

乔尔

如果我正确认识你,你已经得到了验证正确的。问题是您不想显示登录用户的日历;你想显示你的客户的日历。

用户可以写一个日历两种情形之一:

  1. 用户拥有日历,或
  2. 所有者已提供给用户的写权限明确,通过指定用户的电子邮件地址。

显然第二种情况并不规模。无论哪种情况,您都需要将客户的凭证嵌入到应用程序中,然后使用它们代表经过身份验证的用户创建约会,或者与用户共享日历。当然,你会想要加密你的客户端证书 - 不要在你的应用中对它们进行硬编码!

而不是使用您的客户的“真实”的帐户,创建一个新的帐户(具有唯一的电子邮件地址和密码)专为这个日历看起来更安全。您的客户可以通过您的应用程序按照客户的要求访问它,或者您可以与她共享日历并授予她写入权限。

另一种可能性是,使日历的只读到用户,而不是让他们直接创建约会在客户端的日历,你的应用程序可以让他们要求约会:它会创建活动在用户的日历上发送邀请并将邀请发送到您的客户的日历。那么你的应用程序将不需要任何嵌入凭证。它还会让您的客户有机会确认或拒绝每个约会,并自动将其回复发送给她的用户。另一个好处是每个用户的约会会出现在他/她自己的个人Google日历上。

我很想知道你(或其他人)是否找到了更好的解决方案。

+0

感谢您的回答。当你说“加密”时,你如何确切地做到这一点?如果你加密它,然后你需要访问日历,你需要解密它之前发送请求谷歌,因此黑客会看到解密脚本,只是运行它?我应该使用API​​密钥,而不是'http:// code.google.com/apis/console-help /#UsingKeys'吗? – Joel

+0

您的应用驻留在App Engine上,因此无需将客户的凭据传输到用户/从用户传输。您的应用程序只需要存储和检索它们即可完成OAuth握手。 但我越想到允许一个人(用户)代表别人(您的客户)执行某个操作的应用程序,我越感到不舒服。如果第二个选项适用于您,它似乎更安全,功能更丰富。 –

+0

好的。我试图找到如何在我的PHP脚本中使用API​​密钥的信息,似乎无法找到它,隐藏在哪里?当我到我的控制台时,他们唯一说的是'要使用此密钥,请在所有请求中添加密钥= '?我如何使用'简单API访问'?谢谢 – Joel

我有同样的问题,我解决了使用zend框架,即使我不喜欢它,因为它还没有,我正在尝试与谷歌API直接。 (和我不能) Zend环绕他们我想。

我知道这个问题是非常古老的,我嵌入zend loader类和一个日历扩展。 然后我就用:

if($something) { 
    $client = getClientLoginHttpClient($usergmail, $passgmail); 
    createEvent($client,$dbcon,$id_event); 
} 

其中$ dbcon是我的DV连接,和$ id_event是一个ID在哪里可以找到我想要插入数据,(日期,内容,标题,时间等)。 我不喜欢它,但它的工作原理。