将OAUTH2令牌从iOS传递到Rails

将OAUTH2令牌从iOS传递到Rails,ios,ruby-on-rails,oauth-2.0,Ios,Ruby On Rails,Oauth 2.0,我有一个Rails网站,它已经实现并运行了GoogleOAuth2 我们正在开发一个iOS应用程序,它将使用API与我的web服务器进行对话。有些API需要对用户进行身份验证。其思想是,iOS应用程序在设备上使用OAUTH2对用户进行身份验证,然后通过SSL将令牌从设备发布到web作为身份验证。我需要网站来验证令牌 在Google API控制台中,我添加了iPhone设备的客户端ID,并通过转到以下位置获得访问令牌: https://accounts.google.com/o/oauth2/au

我有一个Rails网站,它已经实现并运行了GoogleOAuth2

我们正在开发一个iOS应用程序,它将使用API与我的web服务器进行对话。有些API需要对用户进行身份验证。其思想是,iOS应用程序在设备上使用OAUTH2对用户进行身份验证,然后通过SSL将令牌从设备发布到web作为身份验证。我需要网站来验证令牌

在Google API控制台中,我添加了iPhone设备的客户端ID,并通过转到以下位置获得访问令牌:

https://accounts.google.com/o/oauth2/auth?
scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email&
redirect_uri=urn:ietf:wg:oauth:2.0:oob&
response_type=code&
client_id={my client id}
然后,我将令牌传递到我的站点。在我的站点上,我通过以下方式验证令牌:

google = OmniAuth::Strategies::GoogleOauth2.new(ENV['GOOGLE_API_KEY'],['GOOGLE_CLIENT_API_SECRET'])
client = OAuth2::Client.new(ENV['GOOGLE_API_KEY'],['GOOGLE_CLIENT_API_SECRET'], google.options.client_options)
access_token = OAuth2::AccessToken.new(client, params[:token], google.options.access_token_options || {})
google.access_token = access_token
google.auth_hash
当我尝试验证哈希时,返回以下错误:

 {
  "error": {
   "errors": [
    {
     "domain": "global",
     "reason": "authError",
     "message": "Invalid Credentials",
     "locationType": "header",
     "location": "Authorization"
    }
   ],
   "code": 401,
   "message": "Invalid Credentials"
  }
 }
从这里,我不知道为什么我指定了无效的凭据


ENV['GOOGLE\u API\u KEY']
指向与网站相同的API密钥,
ENV['GOOGLE\u CLIENT\u API\u SECRET']
指向iOS客户端的秘密。

我认为,我上面使用的URL给了我一个
访问令牌。实际上,它会向我返回一个
授权代码
(然后可以使用该代码获取
访问令牌

解决方案是将
授权码
交换为
访问令牌
,然后我可以传递令牌并使用它

在谷歌网站上,
授权码
访问令牌
之间的区别有些模糊,但你可以在这里了解如何交换它们:

我不知道代码或Rails,但这个错误闻起来像是Google希望http请求上有一个“授权”头,但没有得到。