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

时间:2017-02-08 05:37:18

标签: ios oauth-2.0 google-oauth appauth

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

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

我的第一次尝试是仅使用身份验证代码并执行交换,但由于missing_code_verifier invalid_grant错误而失败,因此我也传递了与AppAuth相同的code_verifier获取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"
}

查看以下帖子:

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

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

1 个答案:

答案 0 :(得分:3)

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

  

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

     

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

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

这不是很好的记录,为此道歉。有关“离线访问”的文档this section中提到了这一点,尽管它纯粹是通过GoogleApiClient在Android使用方面进行了讨论。

  

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

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

但是,如果您使用由后端控制的客户端密钥交换代码,则无需使用PKCE;您可以在AppAuth中为此方案禁用PKCE。