使用 Google 登录通过 Firebase 签名后如何访问课堂 API

Posted

技术标签:

【中文标题】使用 Google 登录通过 Firebase 签名后如何访问课堂 API【英文标题】:How to access clas-s-room api after signing through Firebase using Google Sign-in 【发布时间】:2020-09-18 18:30:25 【问题描述】:

我创建了一个统一应用程序来使用 google 登录并访问 google-clas-s-room api。登录成功,范围也允许访问课程。

问题: 使用firebase登录后如何查询谷歌教室api。 端点:https://clas-s-room.googleapis.com/v1/courses/105459102203 方法:获取 参数:我已经拥有的 CourseId

BearerToken如何从 firebase 中检索它?

当我尝试使用 auth-code 和/或 idToken 时,会出现以下错误:

“错误”: “代码”:401, "message": "请求具有无效的身份验证凭据。需要 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据。请参阅https://developers.google.com/identity/sign-in/web/devconsole-project。", “状态”:“未经身份验证”

提前致谢。

【问题讨论】:

【参考方案1】:

有很多方法可以通过 firebase Auth 成功发出 API 请求,特别是对 Google Clas-s-room API:

    困难的方法是为 firebase.UserCredentials 创建一个 HttpInterceptor 并将其传递给每个 HttpRequest 的标头,如下所示:
headers: new HttpHeaders(
      
        'Content-Type': 'application/json',
        Authorization: `Bearer [$this.user$.AccessToken]`
      )

这就是我所说的困难方式,因为您必须确保每个 API 服务都传递和刷新令牌。

    使用 javascript 库“gapi”登录客户端,然后使用令牌响应作为凭据登录 Firebase。这种方法创建了一个纯 OAuth2 登录,用于向 Firebase 和进一步的 Google API 请求提供服务,如下所示:
declare var gapi;
/** Initialize Google API Client */
initClient(): void 
  gapi.client.init(
    apiKey: environment.firebaseConfig.apiKey,
    clientId: environment.firebaseConfig.clientId,
    discoveryDocs: environment.firebaseConfig.discoveryDocs,
    scope: environment.firebaseConfig.scope,
    );

/** Do a OAuth login and then pass it to a FirebaseAuth service */
  async login() 
      const googleAuth = gapi.auth2.getAuthInstance();
      const googleUser = await googleAuth.signIn();
      const token = googleUser.getAuthResponse().id_token;
      const credential = firebase.auth.GoogleAuthProvider.credential(token);
      await this.afAuth().signInAndRetrieveDataWithCredential(credential);
  
/** Then you're ready to make a request*/
/**
   * Lists all course names and ids.
   * Print the names of the first 10 courses the user has access to. If
   * no courses are found an appropriate message is printed.
   */
  listCourses() 
    this.courses$ = 
      gapi.client.clas-s-room.courses.list(pageSize=10;).then(response => 
      return from<Course[]>(response.result.courses);
    );
  

【讨论】:

以上是关于使用 Google 登录通过 Firebase 签名后如何访问课堂 API的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法确定用户是通过自定义 Firebase 帐户还是通过 Flutter 中的 Google 帐户登录的?

通过 Firebase 登录 Google ->

Google Play 游戏、Firebase 和新的 Google 登录

如何将 Google Play 游戏登录与 Firebase 身份验证结合使用

通过 Firebase 身份验证使用 Google Play 游戏

Firebase Google 登录 (iOS) - 从未调用过 GIDSignInUIDelegate 方法