跨客户端Google OAuth:在iOS上获取身份验证代码并在服务器上获取访问令牌

qua*_*tum 5 ios oauth-2.0 google-oauth appauth

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

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

我的第一次尝试是只使用auth代码并执行交换,但是由于missing_code_verifier invalid_grant错误而失败,所以我也传递了相同的code_verifierAppAuth用于获取auth代码到我的服务器,并修复了该错误.首先,是否有必要将此代码验证程序传递给服务器?似乎有点奇怪.

现在,它失败并出现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"
}
Run Code Online (Sandbox Code Playgroud)

看看这样的帖子:

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

任何帮助是极大的赞赏!到目前为止,我所有的试错都没有结果:(

iai*_*gin 7

我是 AppAuth 的主要维护者,负责 Google Identity Platform;希望我能帮忙。

我想在 iOS 上使用 AppAuth SDK 来获取用户的身份验证代码,然后将其发送到我的 Web 应用程序,然后该应用程序将执行访问令牌的交换。

首先,这听起来是否合理,或者是否不可能像这样在客户端之间拆分交易?

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

这没有很好的记录,对此表示歉意。文档中关于“离线访问”的部分提到了这一点,尽管它纯粹是通过 GoogleApiClient 来谈论 Android 使用情况。

是否需要将此代码验证器传递给服务器?似乎有点奇怪。

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

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