web-dev-qa-db-ja.com

OAuthベースとトークンベースの認証の違いは何ですか?

OAuthは基本的にトークンベースの認証仕様ですが、ほとんどの場合、フレームワークはそれらの間に違いがあるかのように動作します。たとえば、次の図に示すように Jhipster は、OAuthベースまたはトークンベースの認証を使用するかどうかを尋ねます。

これらは同じものではありませんか?両方が実装にトークンを含むため、違いは正確に何ですか?

enter image description here

52
Cemre

これは良い質問です。トークンとOAuthについては多くの混乱があります。

まず、OAuthに言及するとき、おそらく OAuth2標準 を参照していることになります。これはOAuthプロトコルの最新バージョンであり、ほとんどの人が「OAuth」と言うときに具体的に話しているものです。

OAuthプロトコルは、いくつかの異なるタイプの認証と承認をサポートしています(正確には4つ)。

第二に、OAuthプロトコルは、トークンを介してユーザーを認証することにより機能します。ここでの考え方は次のとおりです。

OAuth =最初にユーザークレデンシャルを「トークン」と交換し、次にこの「トークン」に基づいてユーザーを認証します。

OAuthの考え方は、ユーザーに機密情報をネットワーク経由で渡す頻度を少なくすることで、悪いことが起こりにくくなるというものです。

ここで、トークンの出番です:OAuth仕様はトークンの概念に基づいて構築されますが、トークンが何であるかを指定しません。

最も一般的な意味では、トークンはユーザーを一意に識別する単なる文字列です。それでおしまい。

人々はこれに気づき、トークンを作成するための新しい標準を開発しました。これは JSON Web Token standard と呼ばれます。この標準は基本的に、非常に特殊な方法でトークンを作成するための一連のルールを提供します。これにより、トークンが一般的により便利になります。

JWTを使用すると、次のようなことができます。

  • トークンに暗号で署名して、ユーザーがトークンを改ざんされていないことを確認します。
  • 内容をプレーンテキストで読み取れないようにトークンを暗号化します。
  • 標準的な方法でトークン文字列内にJSONデータを埋め込みます。

現在、ほとんどの場合、開発コミュニティのほぼ全員が、何らかのOAuthを使用している場合、使用しているトークンはJSON Web Tokenであることに同意しています。

==========

OK!バックストーリーをカバーしたので、あなたの質問に答えさせてください。

上記の選択は、認証/承認用の完全なOAuth2仕様(非常に複雑です)を有効にするか、単に基本的な「トークン認証」が必要かということです。

OAuthプロトコルは標準準拠の方法で複数の異なる認証方法を提供するため、ほとんどの認証システムに多くの複雑さを追加します。

このため、多くのフレームワークは、OAuth2 Password Grantフローの「バカげた」バージョンを提供します。これは、基本的に次のような単純な方法です。

  • ユーザーは、/ loginなどのURLでユーザー名/パスワードをサーバーに送信します。
  • サーバーは、ユーザーのJWTトークンを生成します。
  • サーバーはそのトークンをユーザーに返します。
  • ユーザーは、このトークンをCookie、モバイルデバイス、または可能性のあるAPIサーバーに保存し、そこでそれを使用して要求を行います。

繰り返しますが、上記のフローはNOT OAuthに準拠していますが、STILLがトークンを使用するわずかに単純なバージョンです。

ここでの主なポイントは、トークン(JWT)が一般的に有用であり、OAuthフローとペアにする必要がないことです。

これはテキストの壁であることがわかりますが、うまくいけばあなたの質問にもっと深く答えることができます=)

123
rdegges

セキュリティで保護されたWebサービスからリソースを要求するとき、呼び出しで認証トークンを提供できます。トークンは、リソースにアクセスするための「秘密コード」として機能します。

OAuthは、特定の種類のトークンベースの認証方法です。

5
lipponen

OAuthは認証ではなく認可の仕様です

OAuth 2.0は認証の仕様ですが、認証の仕様ではありません。 RFC 6749、 .1。Authorization Endpoint は次のように明示的に述べています。

許可エンドポイントは、リソース所有者と対話して許可付与を取得するために使用されます。認可サーバーは、最初にリソース所有者の身元を確認する必要があります。認可サーバーがリソース所有者(たとえば、ユーザー名とパスワードのログイン、セッションCookie)を認証する方法は、この仕様の範囲を超えています

OAuth=を使用するのは、APIにサードパーティサービスへのアクセスを許可する場合のみです。OAuthトークンベースまたはセッションベースなど)を使用して認証します。OAuthは認証用に設計されていません。

これを参照してください question

1
nithin