在到期前使​​用omniauth刷新LinkedIn令牌

时间:2013-01-16 00:16:27

标签: ruby-on-rails omniauth linkedin

我有一个Rails(3.2.11)应用程序,允许用户发布他们的LinkedIn个人资料的更新。我目前正在使用omniauth-linkedin gem来捕获初始用户身份验证,并使用linkedin gem来发布更新。我遇到的问题是,LinkedIn访问令牌在60天后过期,但根据他们的documentation,令牌可以在到期前刷新,而无需用户重新授权该应用程序。

我查看了LinkedIn Tips and TricksAuthentication Overview以及StackOverflow上的大量帖子 - thisthisthis只是一个帖子几个例子 - 我仍然找不到任何答案。

用户授权应用后(通过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 :: Consumer客户端(其中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 gem功能来处理这种刷新,任何想法是否可行?谢谢!

1 个答案:

答案 0 :(得分:4)

在您的第二种方法中(使用OAuth :: Consumer客户端并传入您现有的访问令牌和秘密)应该为您刷新令牌。正如文档所述,只要当前用户登录到LinkedIn.com并且当前访问令牌尚未到期,该令牌将被刷新。

这并不一定意味着您将获得新的令牌。你可能会得到和以前一样的。关键的区别是令牌的寿命应该是60天。您可以通过检查 oauth_expires_in 参数的值来验证这一点。它应该设置为5184000。

此博客文章详细介绍了如何刷新令牌:https://developer.linkedin.com/blog/tips-and-tricks-refreshing-access-token