回答編集履歴

8

追記7

2019/07/04 12:03

投稿

退会済みユーザー
test CHANGED
@@ -169,3 +169,79 @@
169
169
  何度も言いますが `App.js` の中でHerokuの環境変数は取得できないです。
170
170
 
171
171
  また、APIキーをクライアントサイドで扱うべきではないです。
172
+
173
+
174
+
175
+ # 追記7
176
+
177
+
178
+
179
+ 気が向いたのでがんばって作りました。
180
+
181
+ そろそろベストアンサーにして欲しい気持ちです。
182
+
183
+
184
+
185
+ ![図](dcdf1ebc9e8ed9fc7fcfe43e48632706.png)
186
+
187
+
188
+
189
+ ①クライアントからサーバのAPIを叩きます
190
+
191
+ ②サーバから外部サービスのAPIを叩きます(ここでキーが必要になるはず)
192
+
193
+ ③外部サービスから欲しい情報が返ってきます
194
+
195
+ ④③で得た情報をクライアントに返します
196
+
197
+
198
+
199
+ サーバは
200
+
201
+
202
+
203
+ - PHP Laravel
204
+
205
+ - Ruby Rails
206
+
207
+ - Python Django
208
+
209
+ - Node.js Express
210
+
211
+
212
+
213
+ など色々選択肢があります。
214
+
215
+ 上の図ではなんとなくRailsにしています。
216
+
217
+
218
+
219
+ APIキーのような機密情報はサーバに持たせます。
220
+
221
+ クライアントサイドで扱うのは何度も言っている通り危険です。
222
+
223
+
224
+
225
+ Node.jsでやる場合はExpressというフレームワークが一番有名です。
226
+
227
+
228
+
229
+ サーバについて知識がなければ1から勉強してください。
230
+
231
+
232
+
233
+ 私から示せる `最小限の手順` は上記になります。
234
+
235
+ 下の記事のようにキーを適当に扱って抜かれると大変なことになりますから、十分な知識を持って取り組んでください。
236
+
237
+
238
+
239
+ [https://qiita.com/AkiyoshiOkano/items/72002409e3be9215ae7e](https://qiita.com/AkiyoshiOkano/items/72002409e3be9215ae7e)
240
+
241
+
242
+
243
+ > 素直にメンバーにNPMを入れてもらうよう交渉したほうがいいんでしょうか・・・?
244
+
245
+
246
+
247
+ 必要なら入れるのが大前提としか言えません。

7

追記6

2019/07/04 12:03

投稿

退会済みユーザー
test CHANGED
@@ -135,3 +135,37 @@
135
135
 
136
136
 
137
137
  質問者さんはクライアントとサーバの違いを勉強された方が良い気がしています。
138
+
139
+
140
+
141
+ # 追記6
142
+
143
+
144
+
145
+ どうにもクライアントサイドで動作する `App.js` の中で環境変数が取得できると思い込んでいるようですが、
146
+
147
+ では聞きますが、Herokuの環境変数に `NODE_ENV` と `PUBLIC_URL` は存在しますか?
148
+
149
+
150
+
151
+ ```
152
+
153
+ heroku config
154
+
155
+ === sample-app Config Vars
156
+
157
+ key_test: test
158
+
159
+ ```
160
+
161
+
162
+
163
+ 質問者さんが提示されている通り存在しないはずです。
164
+
165
+ 明らかにprocess.envで取得できる値とherokuにセットしている環境変数に矛盾が生じています。
166
+
167
+
168
+
169
+ 何度も言いますが `App.js` の中でHerokuの環境変数は取得できないです。
170
+
171
+ また、APIキーをクライアントサイドで扱うべきではないです。

6

追記5

2019/07/04 08:38

投稿

退会済みユーザー
test CHANGED
@@ -111,3 +111,27 @@
111
111
 
112
112
 
113
113
  サーバの言語はPHP, Rubyなど色々選択肢はありますがNode.jsが良いならそれでも構いません。
114
+
115
+
116
+
117
+ # 追記5
118
+
119
+
120
+
121
+ `Uncaught ReferenceError: process is not defined`
122
+
123
+ つまり `processは定義されていない` というエラーです。
124
+
125
+
126
+
127
+ > そもそも process.env 自体が使えないはずです。
128
+
129
+
130
+
131
+ と先程から言っているようにクライアントサイドでは `process` はそもそも無いです。
132
+
133
+ 繰り返しになりますがサーバにセットした環境変数はサーバ内でしか取得できません。
134
+
135
+
136
+
137
+ 質問者さんはクライアントとサーバの違いを勉強された方が良い気がしています。

5

追記4

2019/07/04 08:08

投稿

退会済みユーザー
test CHANGED
@@ -85,3 +85,29 @@
85
85
 
86
86
 
87
87
  (`App.js` っておそらくReactコンポーネントか何かだと思うので、それはクライアントサイドになりますからそこでは環境変数は取得できないという話をしているのですが・・・)
88
+
89
+
90
+
91
+ # 追記4
92
+
93
+
94
+
95
+ > ローカル変数にアクセスする方法があるというのがびっくりでした。まだ駆け出しなものでいろいろわからず申し訳ないです
96
+
97
+
98
+
99
+ クライアント側のソースコードは閲覧者に丸見えですからいくらでもデバッグ可能です。
100
+
101
+
102
+
103
+ > どういった構成であれば対応可能でしょうか?
104
+
105
+
106
+
107
+ 私ならサーバを立ててそこでAPIキーを使う処理を行います。
108
+
109
+ その処理で得られた情報をJSON API越しでクライアントに渡します。
110
+
111
+
112
+
113
+ サーバの言語はPHP, Rubyなど色々選択肢はありますがNode.jsが良いならそれでも構いません。

4

追記3

2019/07/04 07:56

投稿

退会済みユーザー
test CHANGED
@@ -65,3 +65,23 @@
65
65
  環境変数に埋めたAPIキーを使うのであれば `サーバーサイド` で行って下さい。
66
66
 
67
67
  サーバ側でAPIキーを使って必要な情報を取得し、クライアント側に送ってもいい情報だけを返すのが一般的な実装です。
68
+
69
+
70
+
71
+ # 追記3
72
+
73
+
74
+
75
+ どうにも噛み合ってない感じがあるので、
76
+
77
+
78
+
79
+ > App.js上に以下のように記載したところ、登録がないと怒られます。
80
+
81
+
82
+
83
+ この際の具体的なエラーメッセージを共有して頂いた方が良さそうです。
84
+
85
+
86
+
87
+ (`App.js` っておそらくReactコンポーネントか何かだと思うので、それはクライアントサイドになりますからそこでは環境変数は取得できないという話をしているのですが・・・)

3

追記2

2019/07/04 07:18

投稿

退会済みユーザー
test CHANGED
@@ -17,3 +17,51 @@
17
17
  サーバーサイドからクライアントサイドにAPIKEYを渡しても閲覧者から見えます。
18
18
 
19
19
  APIKEYをクライアントサイドで使ってはいけません。
20
+
21
+
22
+
23
+ # 追記2
24
+
25
+
26
+
27
+ > 上記などを読むと、
28
+
29
+ > ・基本的にAPIKeyは公開すべきではない
30
+
31
+ > ・環境変数にKeyを入れて運用するのがよい
32
+
33
+ > ・環境変数の取得は可能
34
+
35
+ > というように記載されているように読めますが、違うのでしょうか・・・?
36
+
37
+
38
+
39
+ 合っています。
40
+
41
+ ただしすべて `サーバーサイド` 環境であることが前提です。
42
+
43
+ 上げて頂いた記事もすべてサーバーサイド前提で書かれていますよ。
44
+
45
+
46
+
47
+ > (Function内でLocal変数を作成して当てることで完結させればユーザーはデータを取得できない)
48
+
49
+
50
+
51
+ 意味がわからなかったのですが、 `コードを工夫すればクライアントサイドでキーを扱っても良い` と思っているのであればそれは間違いです。
52
+
53
+ クライアントサイドで機密情報を扱うのはやめましょう。
54
+
55
+
56
+
57
+ 例えば質問箱というサービスはクライアントサイドにトークンを持ってきたせいで流出し問題となりました。
58
+
59
+
60
+
61
+ [https://www.itmedia.co.jp/news/articles/1901/29/news117.html](https://www.itmedia.co.jp/news/articles/1901/29/news117.html)
62
+
63
+
64
+
65
+ 環境変数に埋めたAPIキーを使うのであれば `サーバーサイド` で行って下さい。
66
+
67
+ サーバ側でAPIキーを使って必要な情報を取得し、クライアント側に送ってもいい情報だけを返すのが一般的な実装です。

2

追記

2019/07/04 06:59

投稿

退会済みユーザー
test CHANGED
@@ -7,3 +7,13 @@
7
7
 
8
8
 
9
9
  そもそも `process.env` 自体が使えないはずです。
10
+
11
+
12
+
13
+ # 追記
14
+
15
+
16
+
17
+ サーバーサイドからクライアントサイドにAPIKEYを渡しても閲覧者から見えます。
18
+
19
+ APIKEYをクライアントサイドで使ってはいけません。

1

追記

2019/07/04 05:12

投稿

退会済みユーザー
test CHANGED
@@ -1,5 +1,9 @@
1
- クライアントJSでは環境変数の読み込みはできないですがそこは大丈夫ですか?
1
+ クライアントサイドJSでは環境変数の読み込みはできないですがそこは大丈夫ですか?
2
2
 
3
3
 
4
4
 
5
- クライアントJSは `閲覧者のブラウザ` で動作しますから、Herokuサーバの環境変数は読み取れません。
5
+ クライアントサイドJSは `閲覧者のブラウザ` で動作しますから、Herokuサーバの環境変数は読み取れません。
6
+
7
+
8
+
9
+ そもそも `process.env` 自体が使えないはずです。