ユーザーログインやSSLを介した通信に慣れていると確信しているので、質問のより興味深い部分であると思うことに焦点を当てます:読み取り専用アクションを確認する方法- ユーザーを認証する必要はありません -あなた自身のクライアントアプリからのみ受け入れられますか?
何よりも先に、fNekが以前の回答で示唆したマイナス面があります。クライアントアプリは潜在的に敵意のあるユーザーの手にあります。それらは検査され、通信は検査され、コードは分解されます。誰かがクライアントをリバースエンジニアリングしたり、REST APIを悪用したりしないことを保証することはできません。しかし、偶然の試みの前に障壁を置くべきです。
とにかく、一般的なアプローチは次のとおりです。
- クライアントには秘密が含まれています
- リクエストを行うとき、リクエストパラメータとシークレットを連結し、結果をハッシュします
- このハッシュはリクエストとともに送信され、サーバーによってチェックされます
例えば、想像GET
の要求を/products/widgets
クライアントシークレットが「OH_HAI_I_IZ_SECRET」であるとします
HTTP動詞、URL、およびシークレットを連結します。
GET/products/widgetsOH_HAI_I_IZ_SECRET
そして、そのSHA-1ハッシュを取ります:
4156023ce06aff06777bef3ecaf6d7fdb6ca4e02
次に、それを一緒に送信します。したがって、要求は次のとおりです。
GET /products/widgets?hash=4156023ce06aff06777bef3ecaf6d7fdb6ca4e02
最後に、誰かが少なくとも個々のリクエストを再生できないようにするには、タイムスタンプも取得し、それをパラメーターとハッシュに追加します。たとえば、現在のUnix時間では1384987891です。これを連結に追加します。
GET/products/widgetsOH_HAI_I_IZ_SECRET1384987891
ハッシュ:
2774561d4e9eb37994d6d71e4f396b85af6cacd1
そして送信:
GET /products/widgets?time=1384987891&hash=2774561d4e9eb37994d6d71e4f396b85af6cacd1
サーバーはハッシュをチェックし、タイムスタンプが最新であることも確認します(たとえば、クロックが完全に同期しないように5分以内)
警告!あなたはモバイルアプリについて話しているので、誰かの電話が時計を間違えるという明確なリスクがあります。またはタイムゾーンが間違っています。か何か。ハッシュに時間を追加すると、一部の正当なユーザーが壊れる可能性があるため、慎重に使用してください。