2013-01-16 79 views
1

我有一個Rails(3.2.11)應用程序,允許用戶發佈更新到他們的LinkedIn個人資料。我目前正在使用omniauth-linkedin gem來捕獲初始用戶身份驗證,並使用linkedin gem來發布更新。我遇到的問題是LinkedIn訪問令牌在60天后過期,但根據它們的documentation,可以在到期之前刷新令牌,而無需用戶重新授權應用程序。在到期前刷新LinkedIn令牌omniauth

我已經看過了LinkedIn Tips and TricksAuthentication Overview,並噸帖子StackOverflow上 - thisthis,並this僅僅是一個幾個例子 - 我仍然找不到任何答案。

當用戶授權應用程序(通過omniauth-linkedin)後,我保存從LinkedIn返回給我的access_tokensecret。我需要弄清楚如何使用仍然有效的access_token來刷新它,並將過期日期延長60天。

我利用LinkedIn的身份驗證的端點(其中tokens.access_token是當前有效令牌)的嘗試:

url = "https//www.linkedin.com/uas/oauth/authenticate?oauth_token=" + tokens.access_token 
result = RestClient.post(url, {oauth_callback: "http://localhost:3000/users/auth/linkedin/callback"}) 

,但我得到一個undefined method 'request_uri' for #<URI::Generic:0x1b144d20>異常。

我使用的OAuth ::消費客戶(其中tokens.access_tokentokens.token_secret是當前有效的令牌)的嘗試:

configuration = { site: 'https://api.linkedin.com', authorize_path: '/uas/oauth/authenticate', 
        request_token_path: '/uas/oauth/requestToken', access_token_path: '/uas/oauth/accessToken' } 
consumer = OAuth::Consumer.new(ENV['LINKEDIN_APP_ID'], ENV['LINKEDIN_SECRET'], configuration) 
access_token = OAuth::AccessToken.new(consumer, tokens.access_token, tokens.token_secret) 

但這只是給我回相同access_tokensecret

最後,我希望能夠利用現有的omniauth-linkedin寶石功能來處理這種刷新,如果這是可能的任何想法?謝謝!

回答

4

在第二種方法中(使用OAuth :: Consumer客戶端並傳入您現有的訪問令牌和密鑰)應爲您刷新令牌。正如文檔所述,只要當前用戶登錄LinkedIn.com並且當前訪問令牌尚未過期,令牌將被刷新。

這並不意味着你會得到一個新的令牌。你可能會得到和以前一樣的東西。關鍵的區別是,令牌的使用壽命應該是60天。您可以通過檢查oauth_expires_in參數的值來驗證此情況。它應該被設置爲5184000.

本博客文章將詳細介紹刷新令牌:https://developer.linkedin.com/blog/tips-and-tricks-refreshing-access-token

+0

我想同樣的方法,並返回我通過在相同的令牌和祕密,但是'params'是爲空,所以我無法驗證我的令牌的到期日期是否從現在起重置爲60天。 – ACIDSTEALTH