質問編集履歴
2
config>application.rbを追加
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でそのリクエストを処理する部分のコードを追加いたしました。
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
|
+
つまり、セッションが有効になっていないことが原因と考えております。
|