Google课堂API对象身份验证

vic*_*tcu 6 authentication google-api

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

  1. 用户X登录到使用谷歌登录,和我自己的网站保存用户的谷歌登录对象(这是在id_token的形式转移到我的服务器和解码,以确保在详细描述真实性这里)在我的数据库.该响应最终看起来像这个严重编辑的对象:

{
   "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"
}
Run Code Online (Sandbox Code Playgroud)

  1. 我想代表用户在Google Classroom中做一些事情,比如列表教室.因此,我要求通过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
  }
 ]
}
Run Code Online (Sandbox Code Playgroud)

  1. 现在,我想将此信息传达给我的服务器,并将其存储在与用户关联的数据库中.我正在使用JWT 对用户进行身份验证,因此当请求到达我的服务器时,我知道哪个用户发送了它.我知道的是如何信任他们发送给我的谷歌课堂对象实际来自谷歌.

也许我过度思考了,我不应该担心用户将伪造的Google对象数据传播到我的数据库中?我原以为对象是以某种方式签名的,我的服务器可以根据我的应用程序凭据和代理用户验证的Google登录对象来验证Google对象的真实性.我认为这个过程类似于Google Login允许我验证服务器端登录的真实性.

如果有一个明确的方法,我没有看到它.任何人都可以帮我把事情放在焦点上吗?

PS这是对这个问题的跟进,不幸的是,这个问题从来没有得到过一个好的答案.

sir*_*poc 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
Run Code Online (Sandbox Code Playgroud)

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

GET /v1/courses HTTP/1.1
Host: classroom.googleapis.com
Content-length: 0
Authorization: Bearer googles_api_access_token_here
Run Code Online (Sandbox Code Playgroud)

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

4) 您的应用程序服务器将课程列表响应给客户端。