5

我没有使用设计或其他类似的宝石。我对 RoR 很陌生。

这是我的路线.rb

# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html

Rails.application.routes.draw do
  get "about", to: "about#index"

  get "password", to: "passwords#edit", as: :edit_password
  patch "password", to: "passwords#update"

  get "password/reset", to: "password_resets#new"
  post "password/reset", to: "password_resets#create"
  get "password/reset/edit", to: "password_resets#edit"
  patch "password/reset/edit", to: "password_resets#update"
  
  get '/auth/:provider/callback', to: 'sessions#create'

  get "sign_up", to: "registrations#new"
  post "sign_up", to: "registrations#create"

  get "sign_in", to: "sessions#new"
  post "sign_in", to: "sessions#create"

  delete "logout", to: "sessions#destroy"

  root to: "main#index"
end

这是user.rb

# email:string
# password_digest:string
#
# password:string virtual
# password_confirmation:string virtual

class User < ApplicationRecord
  has_secure_password

  validates :email, presence: true, format: { with: /\A[^@\s]+@[^@\s]+\z/, message: "must be a valid email address" }
  
end

这是我的omniauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do
    provider :twitter,Rails.application.credentials.dig(:twitter,:api_key), Rails.application.credentials.dig(:twitter,:api_key)
end

我已经在我的 Twitter 应用程序中进行了所有设置。请帮忙。

4

3 回答 3

17

我是 Ruby on Rails for Beginners 课程的作者。我已经更新了视频以反映这些变化。

Omniauth 2.0 已发布,要求您现在使用 POST 请求以确保安全。

现在我们将添加两个宝石:

bundle add omniauth-twitter omniauth-rails_csrf_protection

并确保您api_secret的 omniauth.rb 初始化程序中的第二个参数是:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter,Rails.application.credentials.dig(:twitter,:api_key), Rails.application.credentials.dig(:twitter,:api_secret)
end

method: :post然后您可以通过添加到您的link_to或重定向到 twitterbutton_to

link_to "Connect Twitter", "/auth/twitter", method: :post, class: "btn btn-primary"
button_to "Connect Twitter", "/auth/twitter", method: :post, class: "btn btn-primary"

这适用于 Project 和 Standalone Twitter 应用程序,因此您可以使用其中任何一个。

于 2021-02-07T19:57:58.567 回答
0

似乎对 OmniAuth gem 进行了更改,默认情况下,它只允许 POST 请求。将此添加到您的omniauth.rb文件以允许 GET 请求:

OmniAuth.config.allowed_request_methods = [:post, :get]

进行此更改是出于安全原因。不幸的是,我无法解释。但这将允许您完成 GoRails 教程!

于 2021-02-04T17:36:29.433 回答
0

在这个时间点,Twitter API 开始推出他们的 API 的 v2 版本。本教程使用 v1.1,因此请确保同时使用该版本。为此,请创建一个独立应用程序:

Twitter 开发人员门户显示创建的独立应用程序与项目中创建的应用程序相对。

在将 API 密钥添加到 Rails 凭据并添加http://localhost:3000/auth/twitter/callback到 Twitter 开发人员门户中的回调 URL配置后,将以下额外行添加到omniauth.rb,这些将重新启用获取请求localhost:3000/auth/twitter并从控制台删除安全警告:

# Required to allow get requests, which enables a security flaw but that's how the tutorial is set up.
OmniAuth.config.allowed_request_methods = [:post, :get]
OmniAuth.config.silence_get_warning = true

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, Rails.application.credentials.dig(:twitter, :api_key), Rails.application.credentials.dig(:twitter, :api_secret)
end

重新启动 Rails 服务器并导航到localhost:3000/auth/twitter,这应该会将您重定向到类似于以下内容的 url:

https://api.twitter.com/oauth/authenticate?oauth_token=xov0NQAAAAABMcOqAAABd3F1_T0

如果正在使用的 Twitter 帐户尚未启用该应用程序,则此 URL 将呈现授权屏幕:

Twitter API 应用程序授权屏幕

前提是你OmniauthCallbacksController看起来像这样:

class OmniauthCallbacksController < ApplicationController
  def twitter
    render plain: "success"
  end
end

您的应用应重定向到/auth/twitter/callback. url 看起来像http://localhost:3000/auth/twitter/callback?oauth_token=D4V2tAAAAAABMcOqAAABd3GFmgM&oauth_verifier=TSxCgaVsoQzY039l5DKQBJQiLKkaWBCA,它应该打印success在页面上。

希望这可以帮助!

于 2021-02-05T09:33:39.623 回答