GCP Study

问题

场景一 用户 在客户端 A 上传了数据到数据处理服务 X,并对数据进行了处理,得到处理结果 用户 在客户端 B 上能够获取数据处理服务 X处理结果 ( 数据处理服务 X 对于此用户来说是透明的 )

场景二 数据运营管理平台,用户登录后在直接访问各个服务数据 API 的时候需要鉴权。

名词解释

API 表面 (API surface) API 的公共接口 。API surface 包含各种方法,以及这些方法中使用的参数和返回类型。

Service Management Google Cloud 基础架构服务, 创建并管理 API 和服务。

Extensible Service Proxy(ESP) 基于 NGINX 的服务代理,类似 Isto Service Mesh 方式。

Cloud endpoints 架构

它给出了 API 管理系统,通过 ESP 或 Endpoints Frameworks 提供 比较可扩展服务代理和 Endpoints Frameworks

ESP 可扩展服务代理

endpoint-introduce

供给侧:

  1. 配置 endpoints: 在 OpenAPI 配置文件中描述 API Surface 并配置 Endpoints 功能(例如 API 密钥或者身份验证规则)
  2. 部署 endpoints 配置:定义的 API 后,使用 Cloud SDK 将其部署到 Service Managerment.
  3. 部署 API 后端: 将 ESP 和 API 后端部署到受支持的 Google Cloud 后端,例如 Compoute Engine。ESP 会与 Endpoints 后端服务协同运作,以在运行时保护和监控您的 API。

Endpoints auchitect

组件:

  • ESP
  • Service Control
  • Cloud SDK
  • Google Cloud Console

K8S ESP

这张图更清晰了给出 endpoints 的架构

Endpoints Frameworks

如果需要开发一个基于 GCP 上的 Restful 服务,需要使用 Endpoint Frameworks, 它解决了什么问题? 内置了一个 API 网关,拦截所有请求并执行所有必要的检查(例如身份验证),然后再将请求转发到 API 后端。后端响应后,会收集遥测数据并进行报告。

Endpoints Frameworks

如下功能都在 Endpoints Management 里面完成。

  • 身份验证
  • API 密钥
  • 监控
  • 日志
  • 配额
  • 开发者门户
    • 示例 Google cloud endpoints 从 openapi 文件 解析并展示 API 页面。我们 API 平台 可以参考下。

A python framework for building RESTful APIs on Google App Engine Cloud Endpoint for Go 已经 DEPRECATED,但是有借鉴的意义。

实践

选择身份验证方式在 endpoints 中实践身份验证。Cloud Endpoints 身份验证和 API 密钥

Identity and security

Authentication

  • None
  • API key
    • Identifies your project using a simple API key to check quota(限额) and access
    • API 密钥用于识别正在调用API的调用方项目(应用或网站),而身份验证令牌用于识别正在使用应用或者网站的用户(人员)
    • API 密钥的用途
      • 项目识别 - 识别正在调用相应API的应用或项目
      • 项目授权 - 检查调用方应用是否拥有API的权限,以及是否已在其他项目中启用API
  • OAuth Client ID(以最终用户身份进行身份验证) requests user consent(同意) so your app can acces the user’s data
    • 你需要代表应用的最终用户访问资源,如您的应用需要访问应用用户的 Google BigQuery 的数据集
    • 你需要以用户身份而非作为你的应用进行身份认证。
    • 两个用途
      • 用户身份验证 - 安全的验证调用方用户的真实的身份是否与宣称的一致
      • 用户授权 - 检查用户是否应具备发出此请求的权限
  • Service account Enables server-to-server, app-level authentication using robot account

GCP API 使用 OAuth 2.0 协议进行用户账号和服务账号的身份验证。 OAuth2.0 身份验证过程确定主账号和应用

  • 用户账号 作为 Google 账号进行管理
  • 服务账号 由 Cloud IAM 管理, 代表非人类用户。

哪种适合,查看 Authentication strategies

API 密钥用于识别项目,身份验证用于识别用户

API密钥是不安全的; 由于客户端通常可以访问API密钥,因此API密钥容易被他人窃取。密钥被窃取后,由于没有到期时间,因此可以无限期的使用,除非项目所有者撤销密钥或者重新生成密钥,API 密钥的安全性没有身份验证令牌高。

实践

Cloud EndPoints 快速入门 实践文档。 点击查看示例仓库地址 案例代码

心得

  • 当增加 API 密钥和限流的功能时,不需要更改后端服务任何代码
  • API 的监控通过 Google Cloud Console 来查看,非常方便。

分析

针对场景一

  1. 客户端有自己的业务后台服务,客户端 A 的业务后台服务 A,简称”后台 A“, 客户端 B 则简称”后台 B“, 那么后台 A、B 访问数据处理服务 X属于 server-to-server 的方式来进行身份认证的。缺点是应用级的鉴权。 访问跨项目 BigQuery 数据集 Cross project management using service account
  • 给后台 A 创建 Service-Account A, 并授予数据处理服务 X的资源创建、计算、查看角色
  • 给后台 B 创建 Service-Account B, 并授予数据处理服务 X的资源查看、计算角色
  • 问题是 两个 service-account 之间资源理应是隔离的,没办法解决同一用户获得数据的问题。
  • 在 Console 中将 Service-Account B 添加到后台 A,并赋予查看、计算角色
  1. 客户端没有自己的业务后台服务 在 google cloud 里,Firebase 解决移动端用户身份验证 Firebase 用户认证和 IAM 的结合?
  • 客户端 A 开发在同一登录 Congnito 中创建 Service-Account A, 并授予数据处理服务 X的资源创建、计算、查看角色
  • 用户在客户端 A 使用 Congito 登录后,根据 Service-Account A 生成 STS Token,返回给客户端 A
  • 客户端 A 使用 STS Token 直接访问数据处理服务 X, 进行资源的创建,计算,查看
  • 客户端 B 开发也在 Congnito 中创建 Service-Account B, 并授予数据处理服务 X的资源查看、计算角色
  • 用户在客户端 B 使用 Congito 登录后,根据 Service-Account B 生成 STS Token,返回给客户端 B
  • 客户端 B 使用 STS Token 直接访问数据处理服务 X, 进行资源的创建,计算,查看 用户访问的资源是隔离的。怎么处理?

针对场景二

  1. 使用 OAuth Client ID 方式登录 ”以最终用户身份进行身份验证“ 你的应用如何验证用户身份,Google Cloud 使用的 firebase 身份验证 以下步骤为实现无后台的数据运营平台。
  • 完成服务 X 的上线,服务 X 需要接入数据运营平台,通过 IAM 并对用户 A 授予所有资源的查看权限。
  • 用户 A 通过 OAuth2.0 登录后,提示他需要哪些服务的权限(Auth Scope),
  • 进入”服务 X",通过查询服务 X 的资源,并展示。

参考

  1. Cloud EndPoints 简介 https://cloud.google.com/endpoints/docs/openapi/about-cloud-endpoints?hl=zh-cn

  2. Cloud Endpoints 架构概览 https://cloud.google.com/endpoints/docs/images/endpoints_arch.png?hl=zh-cn

  3. Cross project management using serivce account https://stackoverflow.com/questions/35479025/cross-project-management-using-service-account

  4. 以最终用户身份进行身份验证 https://cloud.google.com/docs/authentication/end-user

  5. 使用 firebase 在 App Engine 上对用户进行身份验证 https://cloud.google.com/appengine/docs/standard/python/authenticating-users-firebase-appengine#managing-user-data-in-datastore 例子比较简单,并没有结合 IAM 来实现权限控制。

  6. IBM OAuth 2.0 工作流程 https://www.ibm.com/support/knowledgecenter/zh/SSPREK_9.0.2/com.ibm.isam.doc/config/concept/con_oauth20_workflow.html#con_oauth20_workflow

  7. 《OAuth 2.0 实战》 百度网盘 -> 我的文档, 在Kami上阅读

  8. [认证 & 授权] https://www.cnblogs.com/linianhui/category/929878.html

  9. [OIDC in Action] 详细流程展示OIDC过程 https://www.cnblogs.com/linianhui/category/1121078.html

  10. sample for oidc 上面文档的代码 https://github.com/linianhui/oidc.example

  11. Identity Server 4 - Hybird Flow - MVC 客户端身份认证 https://www.cnblogs.com/cgzl/p/9253667.html https://www.cnblogs.com/cgzl/tag/OAuth2/


·End·
最后修改 January 18, 2021 : fix only one h1 in page (76541b8)