在我的meteor应用程序中,如何代表我的用户进行经过身份验证的Google API调用?

时间:2014-11-21 10:15:06

标签: meteor google-api google-calendar-api

背景:这是我的第一个独立网络开发项目,我在Meteor的唯一经验是在去年夏天构建了Discover Meteor应用程序。作为对学校的兴趣,我来自大约一年的CS经验,我对C和C ++最为满意。我有python和java的经验。

到目前为止的项目:我正在创建一个日历管理系统(为了好玩)。使用account-google,我创建了通过Google验证的用户帐户。我已经为我的应用程序请求了必要的权限,包括' identity'和'日历读/写访问'我花了大约一个星期左右试图克服下一个障碍,这实际上是从谷歌获取数据。

目标:我希望能够使用GET请求对Calendar.list进行API调用。我已经调用meteor add http来添加GET请求功能,我的问题是实际实现。

问题:我已在开发者控制台上注册了我的应用,并使用客户端ID和密码设置了帐户,但我无法找到/生成我的&#API; API密钥&# 39;用于请求。 Here是使用我已下载的私钥创建访问令牌的Google指南。我很难用JS围绕服务器端的实现,因为我对实现示例的HTTP / REST部分中提到的内容没有多少经验。我将非常感谢如何实现握手并获得在我的应用程序中使用的访问令牌。如果有一个我可以制作的电话或一些能够为我处理令牌生成的包,那将比实施帮助更好。我相信对此的回答也会使this other question

受益

我到目前为止所提到的SO答案:https://stackoverflow.com/a/14543159/4259653其中一些是西班牙语,但它是可以理解的代码。他有一个API密钥用于他的请求,我问这个问题是为了帮助我。 accounts-google文档并不足以向我解释这一切。

也是一个无关紧要的小问题:什么是最简单的方法来处理'时间'请求中的参数。我假设JS有某种内置功能,我还没有意识到。

3 个答案:

答案 0 :(得分:2)

感谢您的研究。我还问过very similar question,现在我正在调查你推荐的套餐。我考虑过这个meteor-google-api包,但看起来已经放弃了。

关于时间操纵的问题,我推荐MomentJS。那里有很多套餐;我正在使用meteor add mrt:moment

编辑: MomentJS现在有一个官方的Meteor包,所以使用meteor add momentjs:moment代替上面的mrt命令

下面是一个可以做什么的片段。更多文档here

var startTimeUTC = moment.utc(event.startTime, "YYYY-MM-DD HH:mm:ss").format();
//Changes above formatting to "2014-09-08T08:02:17-05:00" (ISO 8601)
//which is acceptable time format for Google API

答案 1 :(得分:0)

所以我开始尝试在服务器端自己实现所有这些,但是我对我正在做的很多硬编码和我正在填补空白的假设持谨慎态度。我的安全教授。曾经说过“永远不要自己实施加密”,所以我决定再拿一个有用的包。将搜索条件修改为“JWT”,我在气氛中找到了jagi的meteor-google-oauth-jwt。自述文件非常全面,提供了我需要的一切。遵循The Google OAuth Guide中使用的过程,可以进行授权请求并生成用于进行API调用的密钥。

链接到大气:https://atmospherejs.com/jagi/google-oauth-jwt

链接到回购:https://github.com/jagi/meteor-google-oauth-jwt/

我将使用Google API流程中遇到的任何其他障碍更新此答案以及我如何解决这些障碍:

最近,我遇到了API请求结果的问题。我从API调用中得到一个空的日历表。我怀疑这是因为我对我的开发者帐户而不是主题用户进行了API调用。我将调查此问题并创建一个新问题或使用我找到的修复程序更新此解决方案。

修复:未将“sub”限定符包括在JWT令牌中。通过修改JWT包令牌生成代码以在delegationEmail: user.services.google.email之后包含scope来修复此问题。我不知道为什么他使用这么长的选项来代替sub:而不是谷歌API,但我很欣赏他的包。

我很快就会熟练掌握这一点,所以如果人们有与流星相关的谷歌认证问题,请告诉我。

答案 2 :(得分:0)

不要使用上面发布的服务帐户!

正确的方法是使用标准Web访问+请求脱机访问。 api页面上的文档具体说明了这一点:

  

通常,当应用程序使用Google API处理自己的数据而不是用户的数据时,应用程序会使用服务帐户。

唯一的例外是当您使用谷歌应用程序域帐户并希望委派对整个域的服务帐户的访问权限时:

  

授权服务帐户代表域中的用户访问数据有时被称为"委派域范围的权限"

这具有逻辑意义,因为必须允许用户“授权”#34;你的申请。

回到海报的原始问题,流程很简单:

1)流星帐户谷歌包已经为你做了大部分工作来获得令牌。您可以包含所需的脱机访问范围。

2)如果您正在构建自己的流程,您将按照auth

中的说明完成库存标准流程并进行调用

这需要您:

1)HTTP调用发出原始请求,或者你可以捎带一些内部流星调用:Package.oauth.OAuth.showPopup() - 去看看源码周围有更多漂亮的函数。

2)然后,您需要创建一个Iron路由器服务器端路由以接受oauth响应,该响应将包含您将用于交换令牌的代码参数。

3)接下来使用此代码进行最后一次调用以交换"代码"对于令牌+ refresh_token

4)将这些存储在您想要的地方 - 我的要求是不是在用户级别存储它们,而是每个用户存储多个

5)使用像 GoogleAPI这样的软件包这会包装Google API调用并在需要时刷新 - 只有在代币存储在用户帐户中时才有效,因此您需要将其分开如果您的令牌存储在其他地方(例如我的情况下)