🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
OAuth 2.0

OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

Q&A

解決済

1回答

6966閲覧

認証とOAuth2の組み合わせについて

argius

総合スコア9394

OAuth 2.0

OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

1グッド

4クリップ

投稿2016/05/28 11:57

編集2016/05/30 11:03

最近のWebシステム(あるいは広義の「Webサービス」)はOAuth2が使われることが多くなってきましたが、
OAuth2が行うのはあくまでも「認可」であって、「認証」として使うのは危険であると書かれているのを(流し)読みました。

単なる OAuth 2.0 を認証に使うと、車が通れるほどのどでかいセキュリティー・ホールができる | @_Nat Zone
http://www.sakimura.org/2012/02/1487/

...

ここで質問なのですが、

OAuth2を使ったシステムでは、
認証の部分は昔ながらのユーザーテーブル管理(パスワードはハッシュするとか)のようにしているのでしょうか。

また、OAuth2を使わずにログイン(そのサービス固有のアカウントでパスワードログイン)する場合と、
OAuth2でログインする場合では、
「認証」の部分は同じなのでしょうか。

全部でなくても良いので、もしくは
参考URL貼っていただくだけとかでもかまいませんので、回答お待ちしております。

よろしくお願いします。

maisumakun👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

なるべく誤解がないようにしたかったのですが、長文になりました…。
ご参考になれば、幸いです。


OAuth2を使ったシステムでは、
認証の部分は昔ながらのユーザーテーブル管理(パスワードはハッシュするとか)のようにしているのでしょうか。

OAuth2やOpenID Connectの様な仕組みは、
**「IDとパスワードを他に漏らさずに、サービスを提供したい」**というような着想から出ています。
例えば、何かのゲームのプレイ内容をツイートしたいというような場合、
twitterのIDパスワードをそのゲームに管理させずにツイートさせる、
というイメージです。

先の例で、OAuth2を使用したとしますと、
「twitterは「○○ゲーム」より「ツイートの投稿」機能を要求されています。認可しますか?」
というような文面とともに、twitterのIDパスワードの入力フォームが出ると思います。
そして、この画面はtwitterの管理下にあるはずです。
何かのゲームの管理下の画面では無いはずです(IDとパスワードが他に漏れています)。

ですので、ご質問の

OAuth2を使ったシステムでは、
認証の部分は昔ながらのユーザーテーブル管理(パスワードはハッシュするとか)のようにしているのでしょうか。

は具体的には、
「OAuth2の認可の過程で行われる認証の為のIDパスワードは、サービスの使用側ではどのように管理しますか?」
という内容でしたら、
「管理しません」という事になるでしょうか。


また、OAuth2を使わずにログイン(そのサービス固有のアカウントでパスワードログイン)する場合と、
OAuth2でログインする場合では、
「認証」の部分は同じなのでしょうか。

OAuth2は「認可」の為の仕組みで「認証」の為の仕組みではありません。
「認証」の場合は、OAuth2を拡張したOpenID Connectが良いと思います。

OAuth2は、先ほどの例えでは、
何かのゲームに、
twitterの機能(ツイートの投稿)を利用する事を
「認可」する為の仕組みです。

これが認証として使われてしまっているのは、
認可する際に認証が行われており、
その認証が行われたという結果だけ流用し、
別サービス(例えば何かのゲーム)の認証としてみた、
という発想からでしょうか。

しかしながら、そこで行われた認証は、
本来、例えば、twitterのツイート投稿機能を利用する事を認可する為「だけに」行われた認証であって、
何かのゲームの為の認証ではありません。

つまり、twitterの機能を利用できる事をもって、
何かのゲームにログインできるというのは、
おかしな話だ、という事です。

ですので、ご質問の返信としましては
まず、OAuth2でログイン処理を書くべきではないでしょう。

OAuth2ではなく、OpenID Connectで書かれる場合でしたら、

「認証」の部分は同じなのでしょうか。

そこそこ違うものになるはずです。

データ構造ですが、
パスワードは、こちらでは用いないでしょう。
IDは、OpenID Connectの認証で得られる情報(subject等)と紐付けておく必要があるかと思います。

画面も、
「[twitterでログイン]ボタンを押す」
→「twitter側に飛ばされて、IDパスワードのフォームでログイン」
→「戻ってくる」
という風になりますので、ログインフォームを用意する必要はありません。
しかし、戻ってきた際に認証結果を取得するための処理が追加で必要です。

以降のセッションの発行や管理は同じかと思います。

投稿2016/05/31 09:22

i50

総合スコア227

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

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

argius

2016/05/31 09:54

回答ありがとうございます! 大変詳しく書いていただき、ありがとうございます。 いただいた回答全体に対してお返事するのはちょっと難しそうなので、 部分的にお返事させていただきます。 そうですね...いちおう質問の1行目に書いてある > OAuth2が行うのはあくまでも「認可」であって というのが前提としてあるつもりの質問でした。 OAuth2を使っていてもそれとは別に「認証の部分」があるのかなー、と。 質問中の「OAuth2を使ったシステム」というのは 「OAuth2を導入しているシステム」と言い換えたほうが良かったかも知れません。 「OAuth2を使ったログイン」という意図はありません。 「Twitterでログイン」もできるしそのサイト固有のアカウントでもログインできるシステムの場合、 Twitterでログインを選択したときはTwitterで認可された後で、「認証」の処理が必要ではないか、 というのが質問の意図でした。 ですので、最後の方の > しかし、戻ってきた際に認証結果を取得するための処理が追加で必要です。 に出てくる「認証結果を取得するための処理」が最も知りたかったところかも知れません。 あと、"OpenID Connect"というキーワードだけでも かなり参考になりました。 これについても少し学んでみます。
argius

2016/05/31 16:01

もしよろしければ、「認証結果を取得するための処理」というのが 具体的にどういう処理なのか、簡単にで良いのでご解説いただけませんか?
i50

2016/06/01 00:21

適切な返信になっておらず、すみませんでした…。 「認証の処理」というものを、言葉を変えて表現してみますと 何らかの方法でユーザを特定し、 その特定したユーザを一意に示せるIDを取得すること、 となるでしょうか。 そうしますと「認証結果を取得するための処理」の流れは、 Twitterに「Twitterの自ユーザ情報取得API」の使用を認可してもらい、 その認可されたAPIから、 Twitter上においてユーザを一意に示すTwitterのIDを取得し、 TwitterのIDを紐づかせている自前サービスのアカウントのユーザを「認証」する、 という感じになるかと思われます。 Twitterの例のように、認可の仕組みを使って認証をする場合、このAPI周りの仕様が重要ですが、 各サービスでAPIの仕様は統一されていないと思われます。 各サービスのAPIに合うように、それぞれ処理を書かなくてはいけないはずです。 Twitterならこれでしょうか? https://dev.twitter.com/rest/reference/get/account/verify_credentials そこでOpenID Connectです。 ざっくり申し上げますと、 OpenID ConnectはOAuth2の手続きを使って、 「統一された」認証処理を行えるような仕組みになっていて、便利です。 ・各サービスは情報取得APIに色々な識別名を付けていたのでしょうが、それが統一されています(scope=openid)。 ・簡素化の為に、API経由でIDを取得せずとも、IDが手に入ります(ID Tokenのsub)。 ・しかもそのIDは長さの上限が決まっています(255文字)。 OpenID Connect関連のドキュメントです。 ・仕様 http://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html ・実装 https://developers.google.com/identity/protocols/OpenIDConnect http://developer.yahoo.co.jp/yconnect/
argius

2016/06/08 11:46

すみません、返信されていることに気付かず、放置してしまいました。 大変失礼いたしました。 (言い訳になりますが、最近teratailからの通知が来ないことがあるもので...) OpenID Connect関連について深く掘り下げていただいてありがとうございます。 大変恐縮なのですが、よろしければもう少しだけお付き合いください。 > TwitterのIDを取得し、TwitterのIDを紐づかせている自前サービスのアカウントのユーザを「認証」 の部分で、自前サービス側の実装が知りたかったのです。 何でも良いんだと思いますが、一般的にどのように実装されているのかが知りたかったのです。 例えば、 データベースにユーザーマスターがあって、ユーザーのテーブルに自前サービスのIDとは別に TwitterのひもづけID列を持っていて、それとTwitterから取得したIDを照合する、 そしてTwitterからIDが取得できていることをもってパスワードは入力不要となる のような処理で良いのでしょうか?
i50

2016/06/09 00:15

> TwitterのIDを取得し、TwitterのIDを紐づかせている自前サービスのアカウントのユーザを「認証」 の自前サービス側は、仰るとおりどのようなものでも良いかと思います。 私は、twitterIDをPKとして、自前IDの列を持つtwitterID専用のテーブルで対応しています。 あとは、 >それとTwitterから取得したIDを照合する、 >そしてTwitterからIDが取得できていることをもってパスワードは入力不要となる 仰るとおりの処理です。 twitterIDから自前IDを作ったのでなければ、 事前に、 自前IDでログインし、その後twitterIDと連携し、 twitterIDを取得保存するという連携の手順が必要になります。 (自前側の実装が一般的かどうかと言われると、ちょっと自信ありません) (teratailの中の人のお話も聞いてみたいなぁと…)
argius

2016/06/09 13:47

ご返答ありがとうございます。 > 自前IDの列を持つtwitterID専用のテーブル なるほど、サービス別にテーブルを持つというのもあるんですね。 大変参考になりました。 知りたかったところを知ることができました。 途中の返信が遅くなってしまい、本当に申し訳ございませんでした。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問