質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
SPA(Single-page Application)

SPA(Single-page Application)は、単一のWebページのみでコンテンツの切り替えができるWebアプリケーションもしくはWebサイトです。ブラウザでのページ遷移がないため、デスクトップアプリケーションのようなUXを提供します。

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

3回答

5093閲覧

Next.js APIキーを隠したい

shunta80

総合スコア96

SPA(Single-page Application)

SPA(Single-page Application)は、単一のWebページのみでコンテンツの切り替えができるWebアプリケーションもしくはWebサイトです。ブラウザでのページ遷移がないため、デスクトップアプリケーションのようなUXを提供します。

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2022/08/03 06:04

前提

Next.jsでAPIを使ってデータを取得しています。
ページ表示時サーバーサイドでデータを取得
クライアントサイドでの通信は環境変数を使用してAPIキーを指定している

実現したいこと

クリックされた時に
条件を変えてクライアントサイドで再度API通信をした際にAPIキーが見えてしまうので隠したい。

最初はサーバーサイドでAPI通信をしているので問題ないですが、条件を変えて再度API通信をするとクライアントサイドの処理になるためAPIキーがディベロッパーツールで見えてしまう。

クリックイベントでクライアントサイドではなくサーバーサイドで処理を実行させる方法があるのでしょうか?
それが不可の場合APIキーを扱う際は通常どのように管理するのでしょうか?

発生している問題・エラーメッセージ

ボタンをクリック→再度API通信をして条件に合うデータを再取得
クライアントサイドでの処理になるためAPIキーがディベロッパーツール上に表示される

該当のソースコード

index.js

import axios from 'axios'; import { useEffect, useState } from 'react'; export async function getServerSideProps() { let dataes; await axios.get('http://webservice.recruit.co.jp/hotpepper/middle_area/v1/?format=json&key=*****') .then(nn=>dataes=nn.data.results.middle_area) .catch(error=>console.log(error)) return {props:{dataes}} } function Main({dataes}) { const[state,setstate]=useState([]) // 条件を変えるためstateでデータを管理 useEffect(()=>{ setstate(dataes) },[dataes]) // ボタンがクリックされた際に再度API通信をして新たにデータを取得 const pp=()=>{ const url='https://api-cors4544545454.herokuapp.com/http://webservice.recruit.co.jp/hotpepper/large_area/v1/?format=json&key='+process.env.NEXT_PUBLIC_APIKEY; axios.get(url) .then(nn=>setstate(nn.data.results.large_area)) .catch(error=>console.log(error)) } return( <> {state.map((i,index)=>( <div> <p>{i.name}</p> <button onClick={pp}>押下</button> </div> ))} </> ) } export default Main;

試したこと

クライアントサイドでAPI通信をするときは環境変数を使用

クリックされた時にクライアントサイドではなくサーバーサイドで処理を行う方法があるのでしょうか?

補足情報(FW/ツールのバージョンなど)

Next.js ver 12.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ServerMiddleWareはサーバサイド側だけ実行されるので、クライアント側には漏れないかと思います。

但し、サーバ側で実行する関係上、SinglePageApplication(SPA)モードでは使えません。
また、ServerSideRendering(SSR)モードはnode.jsをサーバ側で常時起動させておく必要があり、nginxやapache等のウェブサーバと連携するのであればReverseProxyが必要になりTCP Timewaitでポートが枯渇しやすく、一般に公開する本格的なサービスで使うには向かない印象です。

nuxt.jsのサーバサイド機能を使うくらいならSPAで作りCDNにキャッシュさせ、サーバ側はサーバ側専用の言語でAPIをSPA側へ提供するという設計にした方が良いかと思います。

投稿2022/08/06 06:09

ippei

総合スコア91

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

公開鍵はクライアント側に持たせるもので「.env.local」に書いていたとしても見えてしまいます。例え難読化を行ったとしても見えてしまいます。JavaScript(React)自体がそういうものなのです。クライアント側で公開鍵を用いてサーバーへアクセスし、サーバー側で秘密鍵を用いて処理をし、結果をクライアントへ返します。

まずはAPIキーと呼んでいるものが、本当に隠す必要があるものであるかを確認する必要があります。

投稿2022/08/03 09:45

編集2022/08/03 19:09
laplade

総合スコア29

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

それが不可の場合APIキーを扱う際は通常どのように管理するのでしょうか?

APIキーはサーバサイドのプログラムが持つ形にして、クライアントからのリクエスト時には含めない、という手段が一般的かと思います。

投稿2022/08/03 06:13

maisumakun

総合スコア145930

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shunta80

2022/08/03 06:32

今回の場合ボタンをクリックした際に再度API通信をしたいのですがどのような方法がありますでしょうか?
maisumakun

2022/08/03 07:09

回答のとおりです。 フロントエンドはサーバサイドにAPIキーなしでリクエストを行って、サーバサイドでAPIキーを付与してAPIサーバにリクエストを行う、という流れにすればいいです。
shunta80

2022/08/03 07:21

ありがとうございます。流れは理解しました。 フロント側からサーバーサイドにリクエストを行う方法はどのようにすればいいでしょうか? Next.jsにReactHooksのような元々備わっている機能があるのでしょうか?
maisumakun

2022/08/03 07:29 編集

> フロント側からサーバーサイドにリクエストを行う方法はどのようにすればいいでしょうか? すでにheroku経由でリクエストを投げているようなので、それと同様に書けばいいだけではないかと思います。
shunta80

2022/08/03 07:44

フロントからサーバーサイドへリクエストを行うという部分は方法がわかります。 しかし、APIキーのみサーバーサイド側で付与するという部分がどのように実装すればいいかわかりません。 参考サイトなどありましたご教示いただけますと幸いです。
maisumakun

2022/08/03 07:53

サーバサイドでAPIリクエストを行う際にAPIキーを書き足せばいいだけです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問