访问用户';在Firebase云函数中设置Google日历

访问用户';在Firebase云函数中设置Google日历,firebase,google-api,google-cloud-functions,google-calendar-api,google-signin,Firebase,Google Api,Google Cloud Functions,Google Calendar Api,Google Signin,负责向现有的Flatter应用程序添加云功能。云功能的目标是每隔一段时间运行一次,看看用户帐户的谷歌日历中是否有即将到来的事件 用户使用Google登录插件创建帐户并登录,然后存储在firebase中 我已经将我需要的范围添加到GoogleSignIn对象中 static GoogleSignIn _googleSignIn = GoogleSignIn( scopes: [ 'email', 'https://www.googleapis.com/auth/calendar

负责向现有的Flatter应用程序添加云功能。云功能的目标是每隔一段时间运行一次,看看用户帐户的谷歌日历中是否有即将到来的事件

用户使用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开发者控制台的web应用程序/云函数api项目中获得了客户id和客户机密

现在,我不确定如何使用googleapis/calendar节点项目来使用这个访问令牌进入用户日历

所有示例似乎都希望我再次创建另一个具有作用域的oauth2客户机来检索令牌,但显然用户不会这样做,因为当用户不使用应用程序时,他的操作都将发生在后台

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

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

为了支持这一点,云功能作为服务帐户运行,因此,它们对其他谷歌服务(包括日历)的任何调用都将作为此服务帐户

<>你可能想考虑委派的Auth


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

我一直在从服务账户的角度看问题,但仍然感到困惑。文档中提到服务帐户“通常,当应用程序使用Google API处理自己的数据而不是用户的数据时,应用程序使用服务帐户。”然后谈到“将整个域的权限委托给服务帐户”,这使得用户似乎是G Suite域的一部分。在此应用程序中,登录的用户可能不是应用程序正在使用的G Suite域的一部分。啊,如果他们不是域的一部分,那么您是对的,您不能进行域范围的委派。我不知道如何解决这个问题。使用人工帐户,用户需要直接调用云函数(传递他们的凭据),但这不是您想要的。您希望您的用户允许服务帐户代表他们访问他们的日历,但是,这一个服务帐户最终过于强大。