5

我正在尝试使用我的 iOS 应用和 Rails 网络应用设置 Google OAuth。我在 API 控制台中设置了 2 个单独的客户端(当然具有不同的客户端 ID,但具有相同的前缀)。一个用于 iOS 应用,另一个用于 Web 应用(也client_secret有访问令牌。

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

我的第一次尝试是只获取身份验证代码并执行交换,但由于missing_code_verifier invalid_grant错误而失败,因此我还将code_verifierAppAuth 用于获取身份验证代码的相同内容传递给我的服务器,并修复了该错误。首先,有必要把这个验证码传给服务器吗?似乎有点奇怪。

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.plistURL 方案也设置为。API 控制台中 Web 应用程序的“授权重定向 URI”部分有一堆 Web URL,我也将它们添加com.google...到其中。这个配置不正确吗?redirect_uri进行跨客户端身份验证时重要吗?

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

4

1 回答 1

5

我是 AppAuth 的主要维护者,在 Google 身份平台上工作;希望我能提供帮助。

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

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

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

这没有很好的记录,为此道歉。在文档的本节“离线访问”中提到了这一点,尽管它纯粹是通过 GoogleApiClient 就 Android 使用而言的。

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

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

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

于 2017-02-13T18:30:29.130 回答