API を介してユーザーを認証するために、hmac ベースのワンタイム パスワード プロトコルを実装しようとしています。
アイデアは、ユーザーの一意の識別子 (uid) を秘密鍵とインクリメンタル カウンターに対して暗号化することです。次に、次の呼び出しのためにカウンターをインクリメントします。
encrypt(uid, private_key, counter)
# now increment the counter for the next call
次に、サーバー側で、秘密鍵とカウンターを使用して復号化し、ユーザー識別子 (uid) を取得します。
decrypt(encrpyted_string, private_key, counter)
# now increment the counter for the next received request
これはうまくいきます。カウンターがあるため、各呼び出しは完全に一意 (1 回) です。
しかし、カウンターの同期をどのように処理するのでしょうか? クライアントがリクエストを生成し、次の呼び出しのためにカウンターをインクリメントしてリクエストを送信したが、サーバーがオフラインでリクエストを受信しない場合、またはインターネット接続の問題がありリクエストが通過しない場合はどうなりますか?クライアントは互いのカウンターと同期していません。
これは「リクエストが送信されたかどうかを知る必要がある」というケースですか? つまり、サーバーからの応答ヘッダーを追加して、カウンターがインクリメントされたかどうかを示し、インクリメントされた場合にのみ、アプリのカウンターもインクリメントできます...しかし、逆の場合も同じことが言えます-送信できますリクエスト、サーバーはそれを受け取り、独自のカウンターをインクリメントして応答を送信しますが、サーバーがリクエストを処理している間にインターネット接続が中断され、アプリは応答を受信せず、カウンターをインクリメントしないため、2つが外れています再度同期します。
あなたが私に与えることができる洞察をありがとう。