OAuthについて１から勉強した

仕事でOAuthについて勉強する機会があったので、その際に学んだメモです。
実際の身近なサービスをイメージすると理解しやすかったです。

#OAuthとは
Open Authorizationの略。
SNSやWebサービス間でHTTP上で「アクセス権限の**認可**」を行うためのプロトコルのこと。
たとえば、InstagramとFacebookに同じ写真を投稿する場合、通常であれば、InstagramとFacebookの両方に、ログインIDとパスワードを入力して、ログインが必要になるはず。
しかし、実際はInstagramへのログインだけでどちらにも投稿が可能となっています。
この共有機能に使われているのがOAuthプロトコルなのです。

つまり、

※OAuth2は「**認証**」する仕組みではなく、「**認可**」する仕組みです。
（どのサイトでも強調されていた...）

###認証と認可の違い
認証：「誰が」通信相手かを確認する
認可：「誰が」「誰に」「何の権限を」出来る？を確認する


![2018-09-19_12h55_53.png](https://qiita-image-store.s3.amazonaws.com/0/214243/095c4cbb-fcc9-c633-1b54-f740a06f69e7.png)





###OAuthを利用するメリット
1. パスワードをサードパーティのアプリに渡すことなくAPIを利用できる
2. どのリソースにアクセス可能かを細かくユーザーに認可させることができる
3. ユーザーがパスワードを変更してもアクセストークンに影響がない
4. ID/パスワードが漏洩したとしても、影響がない

OAuthにはOAuth 1.0 と OAuth 2.0　がある

OAuth 1.0 と OAuth 2.0 の仕組みについてはこちらの記事に
👉🏻https://murashun.jp/blog/20150920-01.html#chapter-3

OAuth1.0の問題点やOAuth2.0の特徴についてはこちらの記事に
👉🏻http://www.atmarkit.co.jp/fsmart/articles/oauth2/01.html

#OAuthのクライアントタイプ
OAuthは2種類のクライアントタイプがある
• コンフィデンシャルクライアント (Confidential Client)
サーバ上で動くWebアプリなどのように、client_secretを秘密にできるクライアント。Confidential Clientはクライアント登録時にclient_idとclient_secretという情報を受け取る。

• パブリッククライアント (Public Client)
JSアプリやスマホ上のネイティブアプリなどのように、client_secretを秘密にできないクライアント。Public Clientはクライアント登録時にclient_idのみを受け取る。

#OAuth2.0の発行フロー
OAuth2.0には4種類のフローがある

•  Authorization Code Grant（認可コードグラント）
•  Implicit Grant（インプリシットグラント）
•  Resource Owner Password Credentials Grant（リソースオーナーパスワードクレデンシャルグラント）
•  Client Credentials Grant（クライアントクレデンシャルグラント）
![2018-09-20_11h05_02.png](https://qiita-image-store.s3.amazonaws.com/0/214243/1132258e-1e2a-86c9-91aa-89aebb3af7b9.png)
[The OAuth 2.0 Authorization Framework](https://tools.ietf.org/html/rfc6749#section-4)より
・・・
ちょっとよくわからないので、発行フローのシーケンス図が読めるようになろう...😥

#認証の流れ
どのサービスがクライアント（サービスを使う側）、
そのサービスがサーバー（サービスを提供する側）に当たるのか意識すると理解しやすいと思います。
今回の例だと、
Facebookがサーバー（サービスを提供する側）
Instagramがクライアント（サービスを使う側）です。
InstagramがFacebookのOAuth機能を使って、Facebookに写真を投稿したい、という流れです。

###登場人物（ロール）
[Section 1.1 Roles](https://tools.ietf.org/html/rfc6749#section-1.1)より

|        |    名前    |    役割    |    具体例    |
|:------------------:|:------------------:|:------------------:|:------------------:|
|![kaden_laptop.png](https://qiita-image-store.s3.amazonaws.com/0/214243/2dbf4d68-f064-cb7d-c58c-a0c819f142f3.png)|Resource Owner（リソースオーナー）|リソースへのアクセス権限を許可する人またはエンティティ|        ブラウザ        
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/214243/84afc266-6181-21a3-d0ef-9b7e0c5a85bc.png)|Resource Server（リソースサーバー）|Access Tokenを使ったリソースへのリクエストを受理してリソースを提供することのできるサーバー|       FacebookのAPIサーバー      |
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/214243/b8487dac-b985-4a1a-5f85-650eef297328.png)| Client（クライアント）|権限に基づき、Resource Ownerの代理としてリソースを要求するアプリケーション（Webアプリでも、PC/モバイルアプリでも）|        ユーザーが使っているアプリやサービス      |
|![image.png](https://qiita-image-store.s3.amazonaws.com/0/214243/84afc266-6181-21a3-d0ef-9b7e0c5a85bc.png)| Authorization Server（認可サーバー）|リソースオーナーが認可し権限付与した後、Clientに対し、Access Tokenを発行するサーバー|         Facebookの認証サーバー         |

##Instagramへのログインだけでfacebookに画像を投稿する場合
### Authorization Code Grant Flow（認可コードグラントフロー）
![2018-09-20_17h10_19.png](https://qiita-image-store.s3.amazonaws.com/0/214243/124ff9ca-7058-1bd9-9bf3-8da04a9c0bca.png)

1. ユーザー認可リクエスト
![1.png](https://qiita-image-store.s3.amazonaws.com/0/214243/91fe92ee-949f-6504-044f-622d3531a3fc.png)
![2.png](https://qiita-image-store.s3.amazonaws.com/0/214243/2f464e24-34bc-ff37-c82c-83017d11831c.png)

2. 認可コードの発行＆送付
![3.png](https://qiita-image-store.s3.amazonaws.com/0/214243/2bf54398-fa1a-f776-cb50-0ee18f3bd567.png)
![4.png](https://qiita-image-store.s3.amazonaws.com/0/214243/049b1e69-4fa0-62dc-fa7c-26e84497692e.png)
![5.png](https://qiita-image-store.s3.amazonaws.com/0/214243/bc84b1d1-46b0-9761-1187-33ae6597e354.png)

#用語
・認可コード
　リソースへのアクセスを認可したことを示すコード
・アクセストークン
　リソースへアクセスする際にサーバーに渡されるトークン
・スコープ
　クライアントがアクセスできるリソースを制限するもの
　例：
　　![スコープ例1.png](https://qiita-image-store.s3.amazonaws.com/0/214243/5e0f69cf-179e-70f3-04a9-c9975d53b321.png)

#参考サイト
一番分かりやすい OAuth の説明
https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be
今更聞けないOAuth2.0
https://www.slideshare.net/ph1ph2sa25/oauth20-46144252
OAuth 2.0 の仕組みと認証方法
https://murashun.jp/blog/20150920-01.html
OAuth（オーオース）認証とは | 仕組み・課題・利用例・背景 - 権限認可システム
https://boxil.jp/mag/a3207/