OAuth

OAuth  は、権限の認可を行うためのオープンスタンダードである。

2016年現在の最新の標準は、2012年にRFCとして発行されたOAuth 2.0であるので、本稿でも以下、OAuth 2.0をベースに解説する。

1. 概要
-----

OAuth 2.0では以下の４種類のロールを考える：リソースオーナー、リソースサーバー 、クライアント 、認可サーバー 。リソースオーナーが人間である場合は、リソースオーナーの事をエンドユーザーともいう。 認可サーバーはリソースサーバーと同一のサーバーでも異なるサーバーでもよい。

これら４つのロールを具体例に即して説明する。今、ウェブサイトAにアカウントを持っているユーザ がいたとし、ユーザがAとは別のサイトBにサイトAに保管されているリソースに対して何らかの行動Xを行う権限を与えたいとする。具体的にはサイトAが写真保管サービスでサイトBが印刷サービスだとすると、ユーザが「Aに保管されているリソースへのアクセス」という権限XをサイトBに与えることでユーザはBから写真を印刷する事ができる。

このときユーザはサイトAの信任を得た認可サーバーから認証を受け、認可サーバーからサイトBのXに対するアクセストークンを発行してもらい、サイトBにアクセストークンを渡す。以後、サイトBは必要に応じてサイトAにアクセストークンを見せる事で、Xを行う事ができるようになる。

ここで重要なのは、ユーザがサイトBにサイトAのパスワードを渡していない事である。上述のような権限の認可を行う最も簡単な方法の一つは、サイトAのアカウント用のパスワードそのものをサイトBに渡してしまう方法だが、この方法だと、写真の印刷には必要のない権限すらも全てサイトBに認可してしまう事になる。OAuthはこの単純な方法の欠点をなくした権限認可プロトコルである。

サイトAのアカウントとサイトBのアカウントが紐付けされてしまうセキュリティリスクが存在する。

2. プロトコル
--------

OAuth 2.0のプロトコルフローは以下のとおりである：


 まずクライアントがリソースオーナーに認可要求を出す。図ではクライアントがリソースオーナーに直接要求を出しているが、認可サーバー経由で間接的に要求する事がのぞましい.
 リソースオーナーは認可要求を許諾する旨の返答として認可グラントをクライアントに送る。これも認可サーバー経由で行う事がのぞましい
 クライアントは認可サーバーに認可グラントを送ることでアクセストークンを要求
 認可サーバーはクライアントの認証と認可グラントの正当性の検証を行い、問題なければアクセストークンを発行。
クライアントはアクセストークンにより認証を受けることで、保護されたリソースへのアクセスをリクエスト
 アクセストークンが正当なら、クライアントのリクエストを受け入れる認可グラントにはその発行の方法に以下の４タイプがある：

認可コード：クライアントはリソースオーナーを認可サーバにリダイレクトし、認可サーバはリソースオーナーを認証した上で認可コード型の認可グラントを発行する。
インプリシット：スクリプト言語を使用してブラウザ上で実行されるクライアント向けに認可コードを最適化したもの
リソースオーナーパスワードクレデンシャル：ユーザ名とパスワードのペアのような、リソースサーバーへのフルアクセスを許す情報をリソースオーナーパスワードクレデンシャルと呼び、この情報を直接アクセストークンとして得る。
クライアントクレデンシャル：認可範囲がクライアントの管理下にある保護されたリソース, もしくはあらかじめ認可サーバーとの間で調整済の保護されたリソースに制限されている場合に用いる。

3. 歴史
-----

3.1. 背景
-------

マッシュアップによるWebサービスの連携が増え、デジタルアイデンティティの共有が問題となってきた。OpenIDのような連合アイデンティティが解決策として登場したが、これはIDの持ち主による認証手段であって、それによってどのリソースにアクセスできるかという認可については扱っていない。あるWebサービスAにユーザーの個人情報があるとき、そのWebサービスAと別のWebサービスBが連携し、WebサービスAにある個人情報をWebサービスBが自由にアクセスできる状況は好ましくない。そのため、WebサービスのAPIへのアクセスを認可する手段が必要とされていた。

3.2. OAuth 1.0
--------------

2006年11月、ブレイン・クックはTwitterでのOpenID実装を行っていた。同じ頃、ソーシャルブックマークサイトの Ma.gnolia は、会員がOpenIDを使ってDashboardウィジェットからサービスにアクセスすることを認可する方法を必要としていた。そこでクックとクリス・メッシーナ、Ma.gnolia のラリー・ハーフはデビッド・リコードンと会い、OpenIDを使ってTwitterやMa.gnoliaのAPIの認証委譲する方法を議論した。その結果、APIアクセス委譲についてのオープン標準はまだ存在しないという結論に達した。

OAuth のインターネットコミュニティは2007年4月に誕生し、少人数で新たなオープンプロトコルの草案を書いた。OAuthプロジェクトのことを知ったGoogleのデウィット・クリントンは、支援を表明した。2007年7月、チームは仕様の草案を完成させた。Eran Hammer-Lahav が加わって多数の協力者の調整を行い、より正式な仕様を作成していった。2007年10月3日、OAuth Core 1.0 の最終草案がリリースされた。

2008年11月、ミネアポリスで開かれた第73回のIETF会合でOAuthの非公式会合も開かれ、さらなる標準化に向けてIETFにOAuthプロトコルを提案するかどうかを議論した。会合は盛況で、IETFで正式にOAUTHワーキンググループを立ち上げることに幅広い支持が得られた。

3.3. セキュリティ
-----------

2009年4月23日、OAuth 1.0にセキュリティ問題があることが判明した。これは OAuth Core 1.0 Section 6 にあるOAuth認可フローに影響がある。この問題は、OAuth 1.0a にて修正された。

3.4. OAuth 2.0
--------------

OAuth 2.0は次世代のOAuthプロトコルであり、OAuth 1.0とは後方互換性を持たない。OAuth 2.0はクライアントとなるウェブアプリケーション、デスクトップアプリケーション、スマートフォン、リビングデバイス等のアプリケーションの開発者に対し、リソースアクセス権限を付与する簡単な方法を提供する。この規格は開発途上である。

Eran Hammer-Lahavによれば、IETF OAuthワークグループは2010年終わりごろまでの範囲での締結を期待していたが作業は大幅に遅延し、2012年8月にようやくRFCエディタへ送付された。仕様は中心になる The OAuth 2.0 Authorization Framework の他、など幾つかに分割されている。

facebookの新しいGraph APIはOAuth 2.0 Draft 10 のみをサポートし、OAuth 2.0 としては最大の実装の一つである。 2011年現在、Google およびマイクロソフトは OAuth 2.0による実験的なAPIを提供している。

4. 脚注
-----

5. 関連項目
-------

OpenID
DataPortability

6. 出典・外部リンク
-----------

[3]
[4]
[5]
[6] Googleグループ
[7] on Hueniverse
[8]
[9]
[10] OAuth 1.0 & 2.0翻訳版など
[11] 作島立樹、@IT、2008年1月21日
[12] 真武信和、gihyo.jp、2009年3月31日
[13] 木村篤彦、@IT、2011年2月2日
[14] Nov Matake、@IT、2012年8月27日
[15] Nov Matake、Build Insider、2017年7月21日
[16] Ryo Ito、@IT、2017年9月1日