teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

config>application.rbを追加

2021/04/28 11:16

投稿

gozikyu
gozikyu

スコア4

title CHANGED
File without changes
body CHANGED
@@ -30,7 +30,36 @@
30
30
 
31
31
  フロントエンド(react)で以下のコードにより、railsにリクエストを投げてセッションを確認しています。
32
32
  railsから返ってきたlogged_in:の値によってログイン済みユーザか(セッションが残っているか)を判断しています
33
+
34
+ railsでセッションを記録させるリクエストを送るreactコード
35
+ ```
36
+ const signIn = () => {
37
+ axios
38
+ .post(
39
+ process.env.REACT_APP_HOST + ":3001" + "/login",
40
+ {
41
+ user: {
33
- ```ここに言語を入力
42
+ email: email,
43
+ password: password,
44
+ },
45
+ },
46
+ { withCredentials: true }
47
+ )
48
+ .then((response) => {
49
+ console.log("registration res", response);
50
+ const createdId = response.data.id;
51
+ console.log(createdId);
52
+ props.login();
53
+ history.push({ pathname: "/users/" + createdId });
54
+ })
55
+ .catch((error) => {
56
+ console.log("registration error", error);
57
+ alert("メールアドレスとパスワードの組み合わせが正しくありません。");
58
+ });
59
+
60
+ ```
61
+ railsにセッションを確認させるリクエストを送るreactコード
62
+ ```
34
63
  const checkLoginStatus = () => {
35
64
  axios
36
65
  .get(process.env.REACT_APP_HOST + ":3001" + "/login", {
@@ -54,12 +83,23 @@
54
83
  上記リクエストが以下のルートによって、sessions_controllerのnewに届きます
55
84
  ```ここに言語を入力
56
85
  get '/login', to: 'sessions#new'
86
+  post '/login', to: 'sessions#create'
57
87
  ```
58
88
 
59
89
  sessions_controller.rb
60
90
  ```ここに言語を入力
61
91
  before_action :logged_in_user, only: [:new]
62
92
 
93
+ def create
94
+ @user = User.find_by(email: signin_params[:email])
95
+ if @user && @user.authenticate(signin_params[:password])
96
+ session[:user_id] = @user.id
97
+ render json: current_user
98
+ else
99
+ render status: 404
100
+ end
101
+ end
102
+
63
103
  def new
64
104
  if current_user
65
105
  render json: { logged_in: true, user: current_user, session: session[:user_id] }
@@ -90,7 +130,82 @@
90
130
  message: null
91
131
  session: null
92
132
  ```
133
+ config>application.rb
134
+ ```ここに言語を入力
135
+ require_relative 'boot'
93
136
 
137
+ require 'rails'
138
+ # Pick the frameworks you want:
139
+ require 'active_model/railtie'
140
+ require 'active_job/railtie'
141
+ require 'active_record/railtie'
142
+ require 'active_storage/engine'
143
+ require 'action_controller/railtie'
144
+ require 'action_mailer/railtie'
145
+ require 'action_mailbox/engine'
146
+ require 'action_text/engine'
147
+ require 'action_view/railtie'
148
+ require 'action_cable/engine'
149
+ # require "sprockets/railtie"
150
+ require 'rails/test_unit/railtie'
151
+
152
+ # Require the gems listed in Gemfile, including any gems
153
+ # you've limited to :test, :development, or :production.
154
+ Bundler.require(*Rails.groups)
155
+
156
+ module Myapp
157
+ class Application < Rails::Application
158
+ # Initialize configuration defaults for originally generated Rails version.
159
+ config.load_defaults 6.1
160
+ # Configuration for the application, engines, and railties goes here.
161
+ #
162
+ # These settings can be overridden in specific environments using the files
163
+ # in config/environments, which are processed later.
164
+ #
165
+ # config.time_zone = "Central Time (US & Canada)"
166
+ # config.eager_load_paths << Rails.root.join("extras")
167
+
168
+ # Only loads a smaller set of middleware suitable for API only apps.
169
+ # Middleware like session, flash, cookies can be added back manually.
170
+ # Skip views, helpers and assets when generating a new resource.
171
+ config.api_only = true
172
+ config.middleware.insert_before 0, Rack::Cors do
173
+ allow do
174
+ origins 'http://localhost:80', 'http://独自ドメイン'
175
+ resource '*',
176
+ headers: :any,
177
+ methods: %i[get post patch delete options],
178
+ credentials: true
179
+ end
180
+ end
181
+
182
+ config.hosts << '.example.com'
183
+ config.hosts << '独自ドメイン'
184
+ config.hosts << 'localhost'
185
+
186
+ # セッションメソッドを有効にする
187
+ config.middleware.use ActionDispatch::Cookies
188
+ config.middleware.use ActionDispatch::Session::CookieStore
189
+ config.middleware.use ActionDispatch::ContentSecurityPolicy::Middleware
190
+
191
+ config.time_zone = 'Tokyo'
192
+ config.active_record.default_timezone = :local
193
+
194
+ config.action_dispatch.default_headers = {
195
+ 'Access-Control-Allow-Credentials' => 'true',
196
+ 'Access-Control-Allow-Origin' =>
197
+ if Rails.env.production?
198
+ 'http://独自ドメイン'
199
+ else
200
+ 'http://localhost'
201
+ end,
202
+ 'Access-Control-Request-Method' => '*'
203
+ }
204
+ end
205
+ end
206
+
207
+ ```
208
+
94
209
  message: nullとなっているのはapplicaion_controllerのlogged_in_userでcurrent_userが存在したいため。
95
210
  current_userが存在しないのはsession[:user_id]が存在しないため。
96
211
  つまり、セッションが有効になっていないことが原因と考えております。

1

reactでセッションを確認するリクエストを送る部分、railsでそのリクエストを処理する部分のコードを追加いたしました。

2021/04/28 11:15

投稿

gozikyu
gozikyu

スコア4

title CHANGED
File without changes
body CHANGED
@@ -24,4 +24,73 @@
24
24
 
25
25
  ご知見ある方いらっしゃいましたら、アドバイスいただけると幸いです。
26
26
 
27
- よろしくお願いいたします。
27
+ よろしくお願いいたします。
28
+
29
+ ### 追記
30
+
31
+ フロントエンド(react)で以下のコードにより、railsにリクエストを投げてセッションを確認しています。
32
+ railsから返ってきたlogged_in:の値によってログイン済みユーザか(セッションが残っているか)を判断しています
33
+ ```ここに言語を入力
34
+ const checkLoginStatus = () => {
35
+ axios
36
+ .get(process.env.REACT_APP_HOST + ":3001" + "/login", {
37
+ withCredentials: true,
38
+ })
39
+ .then((response) => {
40
+ console.log(response);
41
+ setLoggedInStatus(response.data.logged_in);
42
+ setLoaded(true);
43
+ if (response.data.logged_in) {
44
+ return;
45
+ } else {
46
+ alert("ログインして下さい");
47
+ history.push("/signin");
48
+ }
49
+ });
50
+
51
+ ```
52
+
53
+ rails routes.rb
54
+ 上記リクエストが以下のルートによって、sessions_controllerのnewに届きます
55
+ ```ここに言語を入力
56
+ get '/login', to: 'sessions#new'
57
+ ```
58
+
59
+ sessions_controller.rb
60
+ ```ここに言語を入力
61
+ before_action :logged_in_user, only: [:new]
62
+
63
+ def new
64
+ if current_user
65
+ render json: { logged_in: true, user: current_user, session: session[:user_id] }
66
+ else
67
+ render json: { logged_in: false, message: 'ユーザーが存在しません', session: session[:user_id] }
68
+ end
69
+ end
70
+ ```
71
+
72
+ application_controller.rb
73
+ ```ここに言語を入力
74
+ def current_user
75
+ @current_user ||= User.find_by(id: session[:user_id]) if session[:user_id]
76
+ end
77
+
78
+ def logged_in?
79
+ !current_user.nil?
80
+ end
81
+
82
+ def logged_in_user
83
+ render json: { logged_in: false, message: current_user } unless logged_in?
84
+ end
85
+ ```
86
+
87
+ ブラウザのコンソール画面に表示されたresponse.data
88
+ ```ここに言語を入力
89
+ logged_in: false
90
+ message: null
91
+ session: null
92
+ ```
93
+
94
+ message: nullとなっているのはapplicaion_controllerのlogged_in_userでcurrent_userが存在したいため。
95
+ current_userが存在しないのはsession[:user_id]が存在しないため。
96
+ つまり、セッションが有効になっていないことが原因と考えております。