Railsでアプリを作ってます。一般的な、ユーザ認証して記事を投稿するタイプのものです。ユーザ認証はDeviseで作っています。
Twitterで認証するためomniauth-twitter
を使用し、Twitterで認証完了した後のコールバックとして以下のコントローラを作っています。
Ruby
Rails.application.routes.draw do devise_for :users, controllers: {:omniauth_callbacks => 'omniauth_callbacks'} (略) end
そして、このコントローラの中では、認証されたユーザのTwitter id
とユーザ名を使ってレコードを作成しています。
Ruby
class OmniauthCallbacksController < Devise::OmniauthCallbacksController def twitter @user = User.find_for_twitter(request.env['omniauth.auth'].except('extra')) (略) end (略) end
class User < ApplicationRecord devise :registerable, :omniauthable, omniauth_providers: [:twitter, :facebook] def self.find_for_twitter(auth) find_or_create_by(provider: auth["provider"], twitter_id: auth["uid"]) do |user| user.provider = auth["provider"] user.twitter_id = auth["uid"] user.name = auth["info"]["nickname"] end (略) end end
ここで疑問に思ったのですが、この関数を悪意の攻撃者が実行できてしまっては、他人のTwitter IDでアカウントが作れてしまうわけなので、大変まずいですよね。
この関数は、Twitterの認証時のコールバック時以外は実行されないという保証はあるのでしょうか。
ちなみに、rails routes
でエンドポイントを見てみると、
Shell
$ rails routes user_twitter_omniauth_callback GET|POST /users/auth/twitter/callback(.:format) omniauth_callbacks#twitter
となっています。
だから、http://localhost:3000/users/auth/twitter/callback
で叩けてしまうということですよね?
これって大丈夫なんでしょうか。教えて偉い人。。
まだ回答がついていません
会員登録して回答してみよう