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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JWT(JSON Web Token)

JWT(JSON Web Token)とは、JSONをベースとしたアクセストークンの仕様。電子署名付きのURL safeなJSONのことを指します。電子署名が付いているため、改ざんをチェックできる点がメリットです。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

API

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

Q&A

0回答

447閲覧

ログインが不要なスマホアプリにおけるAPIの保護

ry_

総合スコア11

JWT(JSON Web Token)

JWT(JSON Web Token)とは、JSONをベースとしたアクセストークンの仕様。電子署名付きのURL safeなJSONのことを指します。電子署名が付いているため、改ざんをチェックできる点がメリットです。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

API

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

0グッド

0クリップ

投稿2021/01/31 16:04

スマホでゲームアプリをインストール。起動。名前を聞かれる。入力して決定。
この段階でユーザーは確実に誰かと重複する名前のみしか入力していません。
しかしそれだけで問題なく次回以降もユーザーが特定され、データのやり取りもできてしまいます。

ログインをすることなくやり取りすることができるのであれば、自分もその方法でアプリを作ってみたいと思いました。

ネイティブアプリからデータを取得するためには、
ネイティブアプリ→RestAPI→データベースでデータをjsonでやり取りするのが良さそうでした。

ただ、なんの保護もなくエンドポイントを用意した場合。ブラウザで簡単にデータが取得できてしまいます。
ユーザーデータを扱いたいので、アプリからのアクセスでのみAPIを使用できるようにする必要があります。

なので、APIを保護する方法を調べました。
結果、調べても調べてもOAuth2という認証の仕組みが出てきました。
最初は認証サーバーにクライアントとしてアプリを登録し、アプリにクライアントシークレットをもたせてクライアント認証方式でいいのかと思っていまいたが、どうやらネイティブアプリにシークレットをもたせるのはNGのようで、
調べると、どうやらPKCEを使えと出てきます。

ただ、PKCEを使う場合。そこには必ずIDプロバイダーがいます。
GoogleやFacebook、自分でやりたい場合はAuth0などのサービス。

これらは確実にユーザーにIDとPW、メールアドレスを要求します…。

一体全体、スマホアプリはどうやってユーザーのクレデンシャルなしに安全な通信をしているんでしょうか…?


The Best Way to Connect Your iOS App to MySQL Database (4 Steps)

上記ページでは、IOSからAPIを通してMYSQLのデータを持ってくる方法について書いてありました。
このページのコメント欄に以下の質問がありました。

アプリが認証して結果を返すことだけが必要な場合、つまり、このデータをプルするためのクローズドAPIが必要な場合はどうなりますか。どうすればそれを実装できますか?

それに対して記事の投稿者は

クローズドAPIが必要な場合は、リクエストとともにキーを渡すことを検討できます。PHPサービスは、結果を返す前にキーをチェックします。この方法では、ユーザー登録/ログインシステムを作成する必要がなくなり、APIをキーを持つ特定の呼び出し元のみに制限します。

と言っています。
さも簡単そうに言ってるのですが、そんなに簡単なものなのでしょうか?

クライアント認証がNGであるならば、このキーのやり取りもNGにしか思えないのですが…。
何かこのキーを秘匿できる方法があるのでしょうか?

どなたかご助力お願いいたします。

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

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

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

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

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

hoshi-takanori

2021/01/31 17:19

API の保護とユーザーの識別は別です。ユーザーを識別するだけなら、初回に unique な id を発行して、アプリ側で保存するだけです。
ry_

2021/02/01 01:10

APIの保護について調べる→OAuth2についての記事しか出てこない→OAuth2での保護にはIDプロバイダーが必要でありIDとPWが必須らしい→ではIDとPWを要求してこないアプリはどうやって安全なやりとりをしているのか? という質問なのですが、もっと別のやり方があるのでしょうか? 一意のidによるユーザーの識別についてはわかってるつもりです。 修正依頼と言われてもどこを修正したらいいのか自分には判断がつかないです、すみません…。
hoshi-takanori

2021/02/01 20:57

こちらこそ修正依頼というか単なるコメントですみません。「API の保護」や「安全な通信」というのが、何から何を保護したいとお考えなのか分からなかったので。
ry_

2021/02/02 00:42

今回の場合でいえば、アンドロイドやIOSのストアからアプリをインストールし、そのアプリからの通信のみ通過できるAPIルートを作りたいです。
ry_

2021/02/02 00:45

もしくは、そのアプリのユーザーが、そのユーザーの権限でアクセス可能なデータのみ取得可能なルートが作りたいです。
hoshi-takanori

2021/02/02 01:35

アプリ外からのアクセスを防ぐには、アプリに秘密のキーを持たせてそれでチェックするのが一般的だと思いますが、もちろんアプリを解析されればキーは盗めます。 ユーザーの情報を他のユーザーから守るには、普通にログインを実装すれば多くの場合は十分じゃないでしょうか。 OAuth とかは、他のサービスとの連携を安全に行うためのもので、ここで言う安全とは、他のユーザーから守るだけでなく、連携するサービスが悪さをできないように歯止めをかけることも含んでいたと思うので、連携しないなら関係ないと思います。
ry_

2021/02/02 03:49

アプリに秘密のキーを持たせる方法はOAuthのクライアント認証方式でありますけど、それは仰る通りキーが盗めてしまうのでNGだと書いてありました。 それを回避するための方式がコード交換方式のPKCEだと。 結局ログインを実装すれば解決するのはわかってますが、、、 それを必要としていないアプリはどうなのかという話が主題でして、 うーん、勉強した時期が悪かったんですかね、セッションをしないjwtトークンの話ばかりなんですよね、必ず認証局が必要って出てくるし、、、 見直してきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問