2012-08-02 91 views
2

我有一個Rails網站,它已經實現並正在使用Google OAUTH2。將iOS的OAUTH2令牌傳遞給Rails

我們正在開發一個iOS應用程序,它將使用API​​與我的Web服務器通信。某些API需要用戶進行身份驗證。這個想法是,iOS應用程序使用設備上的OAUTH2對用戶進行身份驗證,然後通過SSL將設備上的令牌通過SSL從設備發佈到Web上作爲身份驗證。我需要網站來驗證令牌。

在谷歌API控制檯,我添加了客戶端ID爲iPhone設備,並要得到一個訪問令牌:

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 

當我嘗試auth_hash,返回以下錯誤:

{ 
    "error": { 
    "errors": [ 
    { 
    "domain": "global", 
    "reason": "authError", 
    "message": "Invalid Credentials", 
    "locationType": "header", 
    "location": "Authorization" 
    } 
    ], 
    "code": 401, 
    "message": "Invalid Credentials" 
    } 
} 

從這裏,我不知道爲什麼我指定憑據無效。

ENV['GOOGLE_API_KEY']指向與網站相同的API密鑰,而ENV['GOOGLE_CLIENT_API_SECRET']指向iOS客戶端的祕密。

+0

我不知道代碼或者Rails,但錯誤的氣味就像Google期待的那樣,http請求上的「授權」標題並未獲得。 – drekka 2012-08-10 02:17:22

回答

2

我上面使用的URL,我想,給了我一個access token。實際上,它返回給我一個authorization code(然後可以用來獲得access token)。

解決方案是交換authorization code,爲access token,然後我可以傳遞令牌並使用它。

authorization codeaccess token之間的差異是在谷歌網站上有些模糊,但你可以閱讀有關如何將他們在這裏交流: https://developers.google.com/accounts/docs/OAuth2WebServer