2017-04-13 14 views
3

私は現在、GoにAPIを書いており、認証/承認を正しく安全に行う方法について頭を悩ましています。API認証フロー

私はそれを理解するように、これはそれが行く方法です:アカウントの

  • 新規ユーザー登録をapi/user/registerエンドポイント(または既存のユーザーのapi/user/login)を介して
  • サーバーは、ユーザー名が一意であることを要求してチェックを受けますその後、アクセストークンリフレッシュトークン(どちらもうまくいけば)が発行され、両方ともセキュリティが強化されて署名されています。
  • クライアントアプリケーションはトークンを受信し、ブラウザのCookie(またはローカル/セッションストレージ)に保存し、後続のすべてのリクエストで確実にHTTPS経由でそれらを送信します。
  • 保護ルートへのリクエストを受信すると、サーバーはアクセストークンの有効期限をチェックし、有効期限が切れていれば、データベースのリフレッシュトークンの有効性をチェックします。無効な場合は、クライアント側の再認証を依頼してください。それ以外の場合は、新しいアクセストークンを再発行します。

私の質問は、リフレッシュトークンを扱う手順に関するものです。

私は(Reactの)クライアントアプリケーションも書いています。 APIを一般に公開することはしません。私はクライアントアプリケーション用のAPIとしてバックエンドを書いています。

  • まだリフレッシュトークンを使用する必要がありますか?
  • api/auth/tokenルートが必要ですか?私は実装の例でそれらについて読んでいますが、私はちょうどそうするように別のエンドポイントを照会する代わりに、バックエンドコードでデータベースを照会してトークンを再発行するいくつかのヘルパー関数を持つことができます。

申し訳ありませんが、彼らは馬鹿な質問だが、私は認証仕様を詳細ページの後のページの上に熟読してきたし、ページからページへの微妙な違いは、私は混乱し、本当に「ベストプラクティスは何かがわからないままにしている場合" 生産中。

+0

個別の更新トークンを必要とする要件がありますか?私はあなたの質問に何かを特定することができませんでした。私は実際の世界の生産システムを知っていますが、ほとんどはそうしていません。 –

答えて

0

私はログインという言葉よりも混乱していると思います。 /api/user/loginの代わりに私はそれを/api/user/authenticationと呼びます。 したがって、要求にjsonが本体に添付されている場合は、有効なトークンが返されます。しかし、要求に有効な認証ヘッダーがある場合は、同じ期間有効な新しいトークンを発行するだけです。これは特にフロントエンドに適しているので、自動的に再認証を試みることができます。

newUser := types.User{} 
if r.Body != nil { 
    err := json.NewDecoder(r.Body).Decode(&newUser) 
    ... 
} 
authHeader := r.Header.Get("Authorization") 
if authHeader != "" { 
    _, err := USERAUTH.CHeckJWT(w,r) 
    if err !=nil { 
    ..., 
    } 
    newToken := GenerateTokenFromToken(token) 
}