【问题标题】:Accessing user's Google Calendars in a Firebase Cloud Function在 Firebase 云函数中访问用户的 Google 日历
【发布时间】:2020-01-30 22:38:37
【问题描述】:

负责为现有的 Flutter 应用添加云功能。云功能的目标是每隔一段时间运行一次,看看用户帐户的 Google 日历中是否有即将发生的事件。

用户创建帐户并使用 Google 登录插件登录,然后存储在 firebase 中。

我已将所需的范围添加到 GoogleSignIn 对象

static GoogleSignIn _googleSignIn = GoogleSignIn(
  scopes: [
    'email',
    'https://www.googleapis.com/auth/calendar.events.readonly',
  ],
);

登录过程

final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
final GoogleSignInAuthentication googleAuth =
    await googleUser.authentication;

final AuthCredential credential = GoogleAuthProvider.getCredential(
  accessToken: googleAuth.accessToken,
  idToken: googleAuth.idToken,
);
final FirebaseUser user = await _auth.signInWithCredential(credential);
//update user table in firebase

此时,Google 登录过程会返回一个 访问令牌,我已将其存储在 firebase 中以供以后在云功能中使用。

我有来自 Google Developer Console 中 Web 应用程序/云功能 API 项目的客户端 ID 和客户端密码。

现在,我不确定如何使用 googleapis / 日历节点项目来使用 此访问令牌 进入该用户的日历。

所有示例似乎都希望我再次使用范围创建另一个 oauth2 客户端以检索令牌,但显然用户不会这样做,因为当用户不使用应用程序。

我是否需要创建一个服务帐户,然后才能代表用户访问这些日历?这甚至可以做到吗?我正在努力通过 Google 文档找到答案。

【问题讨论】:

    标签: firebase google-api google-cloud-functions google-calendar-api google-signin


    【解决方案1】:

    我认为(但让我们看看专家怎么说),因为 Cloud Functions 代表人类用户(!)运行并且因为它是异步运行的,所以服务帐户是正确的方法。

    为了支持这一点,Cloud Functions 作为服务帐户运行,因此它们对其他 Google 服务(包括日历)的任何调用都将作为此服务帐户。

    您不妨考虑委托授权link

    在您实施此之前,我鼓励您等着看专家们怎么说。但是,在您等待时查看链接可能是值得的 ;-)

    【讨论】:

    • 我一直在研究服务帐户的角度,但仍然对此感到困惑。文档说服务帐户“通常,当应用程序使用 Google API 处理自己的数据而不是用户的数据时,应用程序会使用服务帐户。”然后谈到“将域范围的权限委托给服务帐户”,这使得用户看起来像是 G Suite 域的一部分。在此应用中登录的用户可能不属于该应用正在使用的 G Suite 域。
    • 啊,如果他们不是域的一部分,那么你是对的,你不能进行域范围的委派。我不知道如何解决这个问题。使用人工帐户,用户需要直接调用 Cloud Function(以传递他们的凭据),但这不是您想要的。您希望您的用户允许服务帐户代表他们访问他们的日历,但是,这个服务帐户最终过于强大。
    猜你喜欢
    • 2017-05-11
    • 1970-01-01
    • 2019-01-31
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多