使用 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 帐户登录的?
Google Play 游戏、Firebase 和新的 Google 登录
如何将 Google Play 游戏登录与 Firebase 身份验证结合使用