Railsでアプリを作ってます。一般的な、ユーザ認証して記事を投稿するタイプのものです。ユーザ認証はDeviseで作っています。
Twitterで認証するためomniauth-twitter
を使用し、Twitterで認証完了した後のコールバックとして以下のコントローラを作っています。
Ruby
1Rails.application.routes.draw do 2 devise_for :users, controllers: {:omniauth_callbacks => 'omniauth_callbacks'} 3 4 (略) 5end
そして、このコントローラの中では、認証されたユーザのTwitter id
とユーザ名を使ってレコードを作成しています。
Ruby
1class OmniauthCallbacksController < Devise::OmniauthCallbacksController 2 def twitter 3 @user = User.find_for_twitter(request.env['omniauth.auth'].except('extra')) 4 (略) 5 end 6 (略) 7end
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
1$ rails routes 2 user_twitter_omniauth_callback GET|POST /users/auth/twitter/callback(.:format) omniauth_callbacks#twitter
となっています。
だから、http://localhost:3000/users/auth/twitter/callback
で叩けてしまうということですよね?
これって大丈夫なんでしょうか。教えて偉い人。。
あなたの回答
tips
プレビュー