我使用这样的珍宝:无法检索的access_token,从设计Omniauth认证策略refresh_token,轨道4,5
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的” 我的应用程序会提示用户权限,然后重定向到我的应用程序。用户在我的数据库中创建了这样的字段 - 电子邮件,提供商,用户体验。但我想也有access_token,refresh_token和expires_at,因为我使用的是很少的Yandex API。
当我httlog'ed上述动作(从点击“登录..”到重定向回我的应用程序),我收到了这些结果:
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": ["[email protected]"], "default_email": "[email protected]", "real_name": "xxxxxx2", "login": "xxxxxxx", "sex": "male", "id": "xxxx123"}[0m
问题:我如何保存ACCESS_TOKEN,将Omniauth身份验证过程中的令牌刷新为用户,因为它清楚可见(第7行),因此它可以使用我的client_id和秘密而不使用任何代码来检索它。
谢谢。
我曾尝试:
新增user.access_token = auth.credentials.token
到self.from_omniauth(auth)
方法在用户模型。但没有任何积极的变化。
UPDATE:在不同的平台存在
同样的问题。例如,共享主机和Linux Ubuntu(从头开始全新的项目)。
您是否尝试在'CallbackController'的'yandex'动作中调试参数?像'puts params'?我很确定access_token在'params'中返回,而不在'auth'哈希中。 –
@Зелёный,是的,我试过了。我只得到'国家'和'代码'的参数。 – Edgars
请分享您通过'p response.headers.fetch('Access-Token')'或'p response.headers.fetch('access_token')'或者'p response.headers' –