我可以在OAuth 2.0中使用Chrome网上应用店付款吗?

Cod*_*gue 14 c# google-oauth google-chrome-app google-api-dotnet-client

我编写了一个托管的Chrome网络应用程序,该应用程序使用适用于.NET的Google API客户端库对使用OAuth 2.0的用户进行身份验证.现在,我想使用内置的Chrome网上应用店付款向我们的应用添加付款.

查看文档时,我需要一个OpenID URL来检查付款.

如何使用OAuth而不是OpenID身份验证来获取此UserID/OpenID URL?

var service = new Google.Apis.Oauth2.v2.Oauth2Service(
    new BaseClientService.Initializer
    {
        HttpClientInitializer = userCredential,
        ApplicationName = "My App Name",
    }
);
HttpResponseMessage message = await service.HttpClient.GetAsync(
    string.Format("https://www.googleapis.com/chromewebstore/v1/licenses/{0}/{1}", 
        appId,
        fedId // Where do I get this??
    )
);
Run Code Online (Sandbox Code Playgroud)

Cod*_*gue 4

我想在这里留下我自己的经验,以便其他人可以看到这不仅仅是使用从授权请求返回到用户配置文件端点的现有 ID 的问题,因为这不是 Chrome Payments API 所需的 ID...

简答

托管应用程序无法仅使用 OAuth2.0。托管应用程序的唯一选项是:

  • 使用已弃用的 OpenID(请参阅详细答案)
  • 使用 Google 电子钱包进行应用内付款以购买数字商品

长答案

我们仍然必须使用 OpenID,但是 Google 为 OpenID 用户提供了一个名为OpenID Connect的 OAuth2.0 迁移路径。此迁移的目的是将旧fedId字段映射到新的 Google+ 用户 ID。

这使我们能够使用现有的 OAuth 2.0 流程检索 OpenID 标识符。

警告: Google .NET 客户端 API 不支持此迁移路径。因此身份验证必须手动完成或使用第三方 OAuth 库

如何:

  • 按照通常的 OAuth 流程,使用以下变量将用户引导至身份验证端点 ( https://accounts.google.com/o/oauth2/auth ):

    • openid.realm=http://localhost ** 必需,与http://localhost您的redirect_uri 变量匹配
    • scope=openid profile https://www.googleapis.com/auth/chromewebstore.readonly **为了检索 OpenID 标识符,openid和范围都是必需的。查询支付 API 需要范围profilechromewebstore
  • 然后从令牌端点 ( https://accounts.google.com/o/oauth2/token )交换访问令牌的代码

    • 此时,您将收到标准access_tokenrefresh_token等变量,还有一个附加id_token变量。
    • id_token是一个包含 OpenID 信息的 JWT 编码字符串。
    • 解码此 JWT 编码(您可以使用此C# JWT 库)字符串将为您提供以下格式的 JSON 字符串:

    { "aud": "<googleuserid>.apps.googleusercontent.com", "at_hash": "<hashcode>", "iss": "accounts.google.com", "openid_id": "<!! The fedId we require !!>", "exp": <id>, "azp": "<googleuserid>.apps.googleusercontent.com", "iat": <id>, "sub": "<googleuserid>" }

    • 到了这个阶段,我们终于找到了我们要找的东西,openid_id. 这可用于与 Chrome Payments API 进行通信
  • 在仍然使用相同的 OAuth 凭据的同时,向以下 URL 发出签名请求:

    • https://www.googleapis.com/chromewebstore/v1/licenses/{appId}/{openId}
    • {appId}是您的应用程序在 Chrome 网上应用店中的 ID
    • {openId}openid_id来自 JWT 响应的