85891
node.jsとOpenWeatherMap APIを使って天気予報サイトを作成してます。  
jsの中でAPIキーを隠す方法が無いらしくnode.js内でAPIを呼び出してます。

jsでgetして、node.jsでAPIを呼びだしています。  
そうするとjs内のurlを使って `http://localhost:3000/get` みたいに他の人が利用されるのではないのか？  
他の人に利用されないようにするにはどうすればいいのでしょうか？  
また、他の安全なAPIの呼び出し方があったら教えてほしいです。  
よろしくお願いします。

**jsのコード**

```

    fetch("get")
        .then((response) => {
            if (!response.ok) {
                throw new Error();
            }
            console.log(response);
            return response.json(); // あるいは response.json()
        })
        .then((json) => {
            console.log("?? ~ file: App.vue ~ line 32 ~ .then ~ json", json);
        })
        .catch((reason) => {
            console.error(reason);
        });
    
```

**node.jsのコード**

```

    app.get("/get", function (req, res) {
        //ここでapiを呼び出して結果を返す
    });
    
```
CC BY-SA 4.0
2022-01-23T11:33:06.277
85877
2022-01-24T01:56:14.597
2022-01-24T00:13:30.197
3060
51056
question
node.js webapi
APIキーを使用した安全なAPIの呼び出し方
OpenID ConnectおよびOAuthを利用するのが一般的かなと思います。  
詳細は  
<https://qiita.com/TakahikoKawasaki/items/498ca08bbfcc341691fe>  
とか  
<https://openid.net/connect/>  
あたりを参照ください。
CC BY-SA 4.0
2022-01-23T14:02:36.460
85880
2022-01-23T14:02:36.460
10174
85877
answer
APIのデータをそのまま返しているということでしょうか？  
であるならば、まずはAPIで取得したデータをそのまま返そうとはせず、  
自分のWebサイトで利用する情報だけに加工して返すようにすれば、まずはそのAPIをパクッて何かしようという人は少ないと思います。すべて丸々そのまま返すようなものを作ってしまうといわゆるサービスの複製とみなされてAPIの規約違反になる可能性もあります。

それでも、有効な情報であるならば自分で作ったAPIの結果を横取りしてくる人はいると思います。  
この問題は[クロスサイトリクエストフォージェリー](https://www.ipa.go.jp/security/vuln/websecurity-
HTML-1_6.html)とも呼ばれ  
その場合はワンタイムトークンやパスワード認証やリファラー制約を利用して解決することもあるでしょう。リンク先参照してください

ただ天気のAPIレベルだと個人情報が抜かれることはなく、脅威となるようなリスクは低いと思われます。唯一リスクを上げるとすれば、無駄にAPIにリクエストしてしまい、API側のコストが上がり、制限に達してしまったり課金されてしまうことがあるかもしれません。

そのいやがらせ的なリクエストに対して対応できる策として、キャッシュの導入を検討しましょう。  
都度APIにリクエストを送るのではなく取得したAPIの結果をDB等に保存して、一定期間はキャッシュから読み取るようにしてしまえばよいと思います。  
天気予報であれば秒単位でリアルタイムで大きく変わることはなく５分、１０分程度のキャッシュを残しておけば十分サービスとして成り立つ可能性もあります。  
これはサービスの要件や要求をもとにキャッシュの可能性を探ってみてください。

ただ実際はそういった不正行為を行ってくる可能性があるのかも検討に踏まえて  
プロダクトとしてリスクとコストを見積もって実装の必要性を探る必要があるでしょう。  
ここはプログラマだけの領域ではなくて依頼主やプロダクトオーナーの判断も必要になるでしょう。
CC BY-SA 4.0
2022-01-24T01:56:14.597
85891
2022-01-24T01:56:14.597
22665
85877
answer