簡體   English   中英

無法使用Devise,Rails 4從Omniauth身份驗證策略中檢索access_token,refresh_token

[英]Can't retrieve access_token, refresh_token from Omniauth authentication strategy with Devise, Rails 4

我正在使用這樣的寶石:

gem "omniauth-yandex"
gem 'devise'

我的設置。

路線

 devise_for :users, :controllers => { :omniauth_callbacks => "callbacks" }

設計初始化器

config.omniauth :yandex, Rails.application.secrets.client_id , Rails.application.secrets.password, callback_url: "http://cb2bcdc4.ngrok.io/users/auth/yandex/callback"

用戶模型

devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :omniauthable, :omniauth_providers => [:yandex]


   def self.from_omniauth(auth) 

      where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
        user.provider = auth.provider
        user.uid = auth.uid
        user.email =  auth.info.email
        user.password = Devise.friendly_token[0,20]
      end

  end

CallbackController

class CallbacksController < Devise::OmniauthCallbacksController        

    def yandex
       #empty
    end
end

視圖:

  <%= link_to "Sign in with Yandex", user_yandex_omniauth_authorize_path, id: "sign_in" %>

當我單擊“使用Yandex登錄”時,我的應用程序提示用戶許可,然后重定向回我的應用程序。 在我的數據庫中使用以下字段創建用戶-電子郵件,提供商,uid。 但是我也希望同時具有access_token,refresh_token和expires_at,因為我使用的是少數Yandex API。

當我完成上述操作(從單擊“登錄..”到重定向回我的應用程序)時,我收到以下結果:

D, [2017-04-26T19:17:42.091838 #24865] DEBUG -- : [0;30;101m[httplog] Connecting: oauth.yandex.ru:443[0m
D, [2017-04-26T19:17:42.266645 #24865] DEBUG -- : [0;30;101m[httplog] Sending: POST http://oauth.yandex.ru:443/token[0m
D, [2017-04-26T19:17:42.267040 #24865] DEBUG -- : [0;30;101m[httplog] Data: client_id=097253682f9f41289ec5exxxxxxx&client_secret=xxxxxxdb4fxx0eadcbb8a4143&code=xxxxx327&grant_type=authorization_code&redirect_uri=http%3A%2F%2Fcb2bcdc4.ngrok.io%2Fusers%2Fauth%2Fyandex%2Fcallback%3Fstate%xxxxxxxxxxx%26code%xxxx[0m
D, [2017-04-26T19:17:42.410712 #24865] DEBUG -- : [0;30;101m[httplog] Status: 200[0m
D, [2017-04-26T19:17:42.410945 #24865] DEBUG -- : [0;30;101m[httplog] Benchmark: 0.143445 seconds[0m
D, [2017-04-26T19:17:42.411168 #24865] DEBUG -- : [0;30;101m[httplog] Response:
{"token_type": "bearer", "access_token": "xxxxxxxxuyBwtcyAFjkBZo3F3MCiIaTI", "expires_in": 31528753, "refresh_token": "xxxxxxxxxxxClSH:Pts0u-Mfls-vdEc7-zTOod9ZWzegNFRxxxxxxxxxxxxxKHpwsqBFUHHKtg"}[0m
D, [2017-04-26T19:17:42.414748 #24865] DEBUG -- : [0;30;101m[httplog] Connecting: login.yandex.ru:443[0m
D, [2017-04-26T19:17:42.609376 #24865] DEBUG -- : [0;30;101m[httplog] Sending: GET http://login.yandex.ru:443/info?format=json[0m
D, [2017-04-26T19:17:42.609720 #24865] DEBUG -- : [0;30;101m[httplog] Data: [0m
D, [2017-04-26T19:17:42.675702 #24865] DEBUG -- : [0;30;101m[httplog] Status: 200[0m
D, [2017-04-26T19:17:42.675972 #24865] DEBUG -- : [0;30;101m[httplog] Benchmark: 0.065791 seconds[0m
D, [2017-04-26T19:17:42.676211 #24865] DEBUG -- : [0;30;101m[httplog] Response:
{"first_name": "xxxxxxxxxxx9", "last_name": "xxxxxxxxxxxxxxx", "display_name": "xxxxx", "emails": ["xxxxxx@yandex.ru"], "default_email": "xxxxx@yandex.ru", "real_name": "xxxxxx2", "login": "xxxxxxx", "sex": "male", "id": "xxxx123"}[0m

問題 :如何將access_token,Omniauth身份驗證過程中的刷新令牌保存到用戶,因為它清晰可​​見(第7行),它確實使用我的client_id和secret來檢索它,而沒有任何我的代碼。

謝謝。

我試過的

在用戶模型中的self.from_omniauth(auth)方法中添加了user.access_token = auth.credentials.token 但是沒有任何積極的變化。

更新

在不同的平台上存在相同的問題。 例如,在共享主機上和Linux Ubuntu中(從頭開始的全新項目)。

訪問令牌由yandex gem提供,或更具體地說,由omniauth-oauth2 gem提供。

只需通過執行以下操作進入您的控制器: request.env["omniauth.auth"].credentials.token

繁榮。 這就是您的訪問令牌。 (刷新令牌和到期數據也在credentials哈希中,只需將其打印出來即可)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM