rails5 api + devise_token_auth:通过omniauth2成功登录后没有访问令牌和uid返回

时间:2016-04-25 13:24:02

标签: ruby-on-rails oauth devise omniauth rails-api

我使用devise_token_auth在weibo和qq上进行omniauth2登录。是的,我正在尝试使用rails5 api功能!

在设置并使用omniauth test_mode后,我似乎登录成功,但登录信息( access_token,expiry,client和uid )在响应标题中返回。

以下是模型,我将候选而不是用户作为身份验证资源。

#app/models/candidate.rb

class Candidate < ApplicationRecord
  devise :database_authenticatable, :trackable, :omniauthable
  include DeviseTokenAuth::Concerns::User

  has_many :recruitments
  attr_writer :password, :password_confirmation
end

使用虚拟omniauth成功信息。

#config/environment/development.rb
#OmniAuth Fake
OmniAuth.config.test_mode = true
OmniAuth.config.mock_auth[:qq_connect] = OmniAuth::AuthHash.new(
  {
      provider: 'qq_connect',
      extra: { raw_info: { nickname: :dev } },
      info: { nickname: :dev },
      uid: '123456'
  })
OmniAuth.config.mock_auth[:weibo] = OmniAuth::AuthHash.new(
  {
      provider: 'weibo',
      extra: { raw_info: { nickname: :dev } },
      info: { nickname: :dev },
      uid: '1234567'
  })

因此,当我向 http://localhost:3000/auth/weibo 发送获取请求时,应用程序会将我重定向到 http://localhost:3000//auth/weibo/callback 。它返回200 Ok。

到目前为止,一切似乎都很好。此外,我还检查了DB,它显示了候选(身份验证资源)已创建,并且其令牌随每次请求而更改。

但是看看响应的标题,我发现内部没有任何用处(访问令牌,到期等)。

#Header of response

Cache-Control →max-age=0, private, must-revalidate
Connection →close
Content-Type →text/plain; charset=utf-8
ETag →W/"7215ee9c7d9dc229d2921a40e899ec5f"
Server →thin 1.6.2 codename Doc Brown
X-Content-Type-Options →nosniff
X-Frame-Options →SAMEORIGIN
X-Request-Id →d91648bb-3e69-4d23-8dfa-9eedfafeac26
X-Runtime →0.085038
X-XSS-Protection →1; mode=block

所以我的问题是如何在使用omniauth2 登录后获取身份验证信息(比如访问令牌,客户端等)?

问候!

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。也许这个决定对某人有帮助。

# app/controllers/overrides/omniauth_callbacks_controller.rb

module Overrides
  class OmniauthCallbacksController < DeviseTokenAuth::OmniauthCallbacksController
    after_action :update_auth_header, only: :omniauth_success
    end
  end
end

路线:

# config/routes.rb

Rails.application.routes.draw do
  scope '/api/v1' do
    mount_devise_token_auth_for 'User', at: 'auth', controllers: {
      omniauth_callbacks:  'overrides/omniauth_callbacks'
    }
    end
  end
end