Google Classroom API对象认证

时间:2019-01-22 20:21:04

标签: authentication google-api

我已成功使用浏览器中的Google Classroom API代表已通过使用Google客户端库通过OAuth2授予​​权限的用户执行操作。我试图弄清楚如何信任从浏览器发送到服务器的API结果。这是一个故事,用以解释我要解决的端到端问题。

  1. 用户X使用Google登录名登录我的网站,然后将用户的Google登录名对象(以id_token的形式传输到我的服务器并进行解码,以确保真实性,具体如here所述)我的数据库。该响应最终看起来像是一个经过大量编辑的对象:

{
   "iss": "accounts.google.com",
   "azp": "redacted-string",
   "aud": "redacted-string",
   "sub": "redacted-string",
   "hd": "redacted-string",
   "email": "redacted-string",
   "email_verified": true,
   "at_hash": "redacted-string",
   "name": "redacted-string",
   "picture": "redacted-string",
   "given_name": "redacted-string",
   "family_name": "redacted-string",
   "locale": "en",
   "iat": redacted-number,
   "exp": redacted-number,
   "jti": "redacted-string"
}

  1. 我想代表用户在Google课堂中做一些事情,例如列出教室。因此,我要求通过Google提供的相应OAuth2工作流程将其发送来获得许可。然后,在获得同意后,我进行了所需的Google Classrooms API调用,以列出教室,并返回教室列表,如下所示:

{
 "courses": [
  {
   "id": "redacted-number",
   "name": "redacted-string",
   "ownerId": "redacted-number",
   "creationTime": "2019-01-09T19:04:28.084Z",
   "updateTime": "2019-01-09T19:04:56.828Z",
   "enrollmentCode": "redacted-string",
   "courseState": "DECLINED",
   "alternateLink": "https://classroom.google.com/c/redacted-string",
   "teacherGroupEmail": "redacted-string",
   "courseGroupEmail": "redacted-string",
   "teacherFolder": {
    "id": "redacted-string"
   },
   "guardiansEnabled": false
  },
  {
   "id": "redacted-number",
   "name": "redacted-string",
   "ownerId": "redacted-number",
   "creationTime": "2019-01-09T19:03:06.321Z",
   "updateTime": "2019-01-09T19:03:05.328Z",
   "enrollmentCode": "redacted-string",
   "courseState": "PROVISIONED",
   "alternateLink": "https://classroom.google.com/c/redacted-string",
   "teacherGroupEmail": "redacted-string",
   "courseGroupEmail": "redacted-string",
   "teacherFolder": {
    "id": "redacted-string"
   },
   "guardiansEnabled": false
  }
 ]
}

  1. 现在,我想将此信息传达给我的服务器,并将其存储在与用户关联的数据库中。我已经在使用JWT来验证用户的身份,因此当请求到达我的服务器时,我知道哪个用户发送了该请求。我不知道是如何信任他们发送给我的Google Classroom对象实际上来自Google。

也许我想得太多了,我不应该担心用户将假Google对象数据传播到我的数据库中吗?我本以为以某种方式对对象进行了签名,以使我的服务器可以通过给定我的应用程序凭据和代理用户的经过验证的Google登录对象来验证Google对象的真实性。我认为该过程类似于Google Login允许我在服务器端验证登录真实性的方式。

如果有明确的方法可以做到这一点,我看不到。谁能帮我把重点放在眼前?

P。 S.遗憾的是,这是对this question的后续行动,遗憾的是从来没有一个好的答案。

2 个答案:

答案 0 :(得分:2)

无法防止有效用户从用户客户端浏览器向您的服务器发布伪造数据。

一种选择是更新您的应用程序,以启用服务器端对Google API的访问。

此处提供有关如何执行此操作的文档: https://developers.google.com/identity/sign-in/android/offline-access

如果您可以从客户端请求访问访问令牌,则还可以执行以下请求模式:

1)客户端向您的应用程序服务器上的API端点发出以下HTTP请求

GET /api/list_courses HTTP/1.1
Host: yourapp.example.com
Content-length: 0
Authorization: Bearer googles_api_access_token_here

2)您的应用程序服务器上的/ api / list_courses端点向googles API服务器发出以下请求:

GET /v1/courses HTTP/1.1
Host: classroom.googleapis.com
Content-length: 0
Authorization: Bearer googles_api_access_token_here

3)来自(2)的响应被发送回您的应用服务器

4)您的应用程序服务器向客户发送课程列表。

答案 1 :(得分:1)

这个问题可能根本不是问题,就像你写的一样:

  

我不知道该如何信任他们发送给我的Google Classroom对象实际上来自Google。

假设API通讯,他们甚至没有发送,但是您通过SSLTLS来获取(主机的证书也可以是validated,而这是不需要,因为当它与A中的DNS记录不匹配时,它是无效的)。用户的ID令牌也可以被验证;参见documentation