跨客户端 Google OAuth:获取 iOS 上的授权码和服务器上的访问令牌

Cross-client Google OAuth: Get auth code on iOS and access token on server

我正在尝试使用我的 iOS 应用程序和 Rails 网络应用程序设置 Google OAuth。我在 API 控制台中设置了 2 个单独的客户端(当然具有不同的客户端 ID,但具有相同的前缀)。一个用于 iOS 应用程序,另一个用于网络应用程序(它也有一个 client_secret。我想在 iOS 上使用 AppAuth SDK 来获取用户的授权码,然后发送到我的网络应用程序,然后它将执行访问令牌的交换。

首先,这听起来像是一件合理的事情,还是不可能像那样在客户之间拆分交易?

我的第一次尝试是获取授权码并执行交换,但是失败并出现 missing_code_verifier invalid_grant 错误,所以我也通过了与 AppAuth 相同的 code_verifier用于将授权代码获取到我的服务器,并修复了该错误。首先,是否需要将这个code verifier传递给服务端?好像有点奇怪。

但是现在,它因 unauthorized_client 错误而失败。我的网络应用正在发出这样的请求:

{
  "grant_type"=>"authorization_code",
  "code"=>"4/XYZ...",
  "client_id"=>"WEB_APP_CLIENT_ID_HERE.apps.googleusercontent.com", 
  "client_secret"=>"WEB_APP_CLIENT_SECRET_HERE", 
  "redirect_uri"=>"https://www.myapp.com/oauth_callback", 
  "parse"=>"json",
  "code_verifier"=>"CODE_VERIFIER_STRING_HERE"
}

查看类似的帖子:

看起来 redirect_uri 可能是这里的问题。我在 iOS 上的 AppAuth 配置将重定向 URI 设置为 com.googleusercontent.apps.iOS_CLIENT_ID_HERE,并且 Info.plist URL 方案也是如此。 API 控制台中网络应用程序的 "Authorized redirect URIs" 部分有一堆网络 URL,我也向其中添加了 com.google...。这个配置不正确吗? redirect_uri 在进行跨客户端身份验证时重要吗?

非常感谢任何帮助!到目前为止,我所有的反复试验都没有结果:(

我是 AppAuth 的主要维护者,在 Google Identity Platform 上工作;希望我能帮上忙。

I want to use the AppAuth SDK on iOS to get the user's auth code, then send that to my web app, which will then perform the exchange for the access token.

First of all, does this sound like a reasonable thing to do, or is it not possible to split the transaction across clients like that?

在您的服务器上交换代码听起来很合理,但我认为您使用的配置可能不正确。如果您在服务器上请求交换代码,请在对授权服务器的请求中使用 服务器的客户端 ID。根据您的描述,听起来您的授权服务器请求正在发送您的 iOS 客户端 ID,然后您正在与您的服务器客户端 ID 进行交换,我相信这就是您看到“unauthorized_client”的原因" 错误。

这没有很好的记录,对此深表歉意。在关于“离线访问”的文档的 this section 中提到了它,尽管它纯粹是通过 GoogleApiClient.Android 使用来谈论它。

is it necessary to pass this code verifier to the server? Seems a little strange.

PKCE 背后的意图是确保发出授权请求的实体与发出代码交换请求的实体相同。 code_verifier正常情况下应该不会离开设备。

但是,如果您使用后端控制的客户端密钥交换代码,则没有必要使用 PKCE;对于这种情况,您可以在 AppAuth 中禁用 PKCE。