Webアプリケーションの認証にSNS連携を行う際に参考になるサイト

# 概要

Webアプリケーションの認証に、SNS連携をSDKを使用せずRest API(若しくはサードパーティライブラリ)で行いたいときに参考になるサイトのまとめです。


# Facebook

## Official

* [開発者向け] (https://developers.facebook.com/)
* [Facebookログイン] (https://developers.facebook.com/docs/facebook-login)
* [ログインフローを手作業で構築する] (https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow)
* [アクセス許可のリファレンス - Facebookログイン] (https://developers.facebook.com/docs/facebook-login/permissions/)

## Endpoint

### ログインダイアログ

```text:EndPoint
https://www.facebook.com/v2.8/dialog/oauth
```

#### Parameter

|Parameter              |Value                  |
|:----------------------|:----------------------|
|client_id              |アプリのID |
|redirect_uri           |ログイン後にリダイレクトするURL | 
|state                  |CSRF対策のアプリが作成する任意で固有の文字列 (option)|
|response_type          |URLパラメータとフラグメントのどちらに応答データを含むか (option)| 
|scope                  |カンマで区切ったアクセス許可のリスト (option)|

**response_type**

* code : デフォルト。応答データはURLパラメータとして返されcodeパラメータが含まれます。
* token : 応答データはURLフラグメントとして返され、アクセストークンが含まれます。

#### Response fields

response_typeの指定内容でフィールドが変わる。

|Field                  |Description            |
|:----------------------|:----------------------|
|code                   |response_typeにcodeを指定した場合に受け取るフィールド |
|token                  |response_typeにtokenを指定した場合に受け取るフィールド |


### アクセストークンのコードの交換

response_typeに`code`を指定した場合、レスポンスで受け取る認証コードを使ってアクセストークンを取得する。

[アクセストークン] (https://developers.facebook.com/docs/facebook-login/access-tokens)

```text:EndPoint(GET)
https://graph.facebook.com/v2.8/oauth/access_token
```

#### Parameter

|Parameter              |Value                  |
|:----------------------|:----------------------|
|client_id              |アプリのID |
|redirect_uri           |ログインダイアログで指定したリダイレクトURL |
|client_secret          |固有のapp secret |
|code                   |ログインダイアログのリダイレクトによって受け取る認証コード |

#### Response fields

|Field                  |Description            |
|:----------------------|:----------------------|
|access_token           |アクセストークン |
|token_type             |Fixed  `bearer`? |
|expires_in             |アクセストークンの有効時間(秒) |

token_typeについて言及しているドキュメントが見当たらなかった。
[The OAuth 2.0 Authorization Framework: Bearer Token Usage] (https://tools.ietf.org/html/rfc6750)

### アクセストークンの検証

response_typeに`token`を指定した場合、レスポンスで受け取るトークンを検証する。

[Graph API Reference - Debug-Token] (https://developers.facebook.com/docs/graph-api/reference/v2.8/debug_token)

```text:EndPoint(GET)
https://graph.facebook.com/debug_token
```

#### Parameter

|Parameter              |Value                  |
|:----------------------|:----------------------|
|input_token            |検査対象のトークン |
|access_token           |アプリのアクセストークン |

#### Response fields

JSONフォーマット

|Field                  |Description            |
|:----------------------|:----------------------|
|app_id                 |アプリのID |
|application            |アプリ名 |
|expires_at             |アクセストークンの有効期限が切れる日付 |
|is_valid               |アクセストークンが有効かどうか |
|issued_at              |アクセストークンが発行された日付 |
|metadata               |アクセストークンのメタデータ |
|scopes                 |権限のリスト |
|user_id                |ユーザーID |


## 参考

* [Facebook ログインで認証するまでの手順 (OAuth認証とトークン置換攻撃対策) - Qiita] (http://qiita.com/shimashima/items/6cae3ef84f0b4a12aa9e)



# Twitter

## Official

* [Twitter Developers] (https://dev.twitter.com/)
* [Sign in with Twitter] (https://dev.twitter.com/web/sign-in)
* [Implementing Sign in with Twitter] (https://dev.twitter.com/web/sign-in/implementing)

## Endpoint

### リクエストトークンの取得

https://dev.twitter.com/oauth/reference/post/oauth/request_token

```text:EndPoint(POST)
https://api.twitter.com/oauth/request_token
```

#### Parameter

|Parameter              |Value                  |
|:----------------------|:----------------------|
|oauth_callback         |リダイレクトURL |
|oauth_consumer_key     |アプリのAPI Key |
|oauth_nonce            |リクエストごとにランダムな任意の文字列 |
|oauth_signature_method |Fixed  `HMAC-SHA1` |
|oauth_signature        |oauth_signature_methodで指定した方式で生成した署名 |
|oauth_timestamp        |リクエスト作成時のタイムスタンプ値 |
|oauth_version          |Fixed  `1.0` |


#### Response fields

|Field                  |Description            |
|:----------------------|:----------------------|
|oauth_token            |リクエストトークン |
|oauth_token_secret     |リクエストトークン・シークレット |
|oauth_callback_confirmed| |


### ログインダイアログへリダイレクトする

https://dev.twitter.com/oauth/reference/get/oauth/authenticate

```text:EndPoint(GET)
https://api.twitter.com/oauth/authenticate?oauth_token={oauth_token}
```

#### Parameter

|Parameter              |Value                  |
|:----------------------|:----------------------|
|oauth_token            |リクエストトークン |
|force_login            | (optional)|
|screen_name            | (optional)|

#### リダイレクト先URL

Twitterのログイン画面でアプリを認証した場合に、リクエストトークンの取得時に指定したリダイレクト先URLにoauth_token、oauth_verifierパラメータが付加されてリダイレクトされる。

|Field                  |Description            |
|:----------------------|:----------------------|
|oauth_token            |認証済みのリクエストトークン |
|oauth_verifier         |リクエストトークンの確認用コード |


### リクエストトークンをアクセストークンに変換する

https://dev.twitter.com/oauth/reference/post/oauth/access_token

```text:EndPoint(POST)
https://api.twitter.com/oauth/access_token
```

#### Parameter

|Parameter              |Value                  |
|:----------------------|:----------------------|
|oauth_token            |認証済みのリクエストトークン |
|oauth_verifier         |リクエストトークンの確認用コード (optional)|
|oauth_consumer_key     |アプリのAPI Key |
|oauth_nonce            |リクエストごとにランダムな任意の文字列 |
|oauth_signature_method |Fixed  `HMAC-SHA1` |
|oauth_signature        |oauth_signature_methodで指定した方式で生成した署名 |
|oauth_timestamp        |リクエスト作成時のタイムスタンプ値 |
|oauth_version          |Fixed  `1.0` |


#### Response fields

|Field                  |Description            |
|:----------------------|:----------------------|
|oauth_token            |アクセストークン |
|oauth_token_secret     |アクセストークン・シークレット |
|user_id                |ユーザーID |
|screen_name            |ユーザー名 |


## 参考

* [Twitter APIの使い方まとめ - Syncer] (https://syncer.jp/twitter-api-matome)
* [OAuth1.0の署名(Signature)を作成する方法 - Syncer] (https://syncer.jp/how-to-make-signature-of-oauth-1)



# Google

## Official

* [Google Develpers] (https://developers.google.com/+/?hl=ja)
* [Add Google Sign-In to Your Website] (https://developers.google.com/identity/sign-in/web/)
* [Google Sign-In for server-side apps] (https://developers.google.com/identity/sign-in/web/server-side-flow)
* [Using OAuth 2.0 to Access Google APIs] (https://developers.google.com/identity/protocols/OAuth2)
* [Using OAuth 2.0 for Web Server Applications] (https://developers.google.com/identity/protocols/OAuth2WebServer)
* [Authorization scopes - Authorizing API requests] (https://developers.google.com/+/web/api/rest/oauth#authorization-scopes)


## Endpoint

### Redirecting to Google's OAuth 2.0 server

```text:EndPoint(GET)
https://accounts.google.com/o/oauth2/v2/auth
```

#### Parameter

|Parameter              |Value                  |
|:----------------------|:----------------------|
|response_type          |Fixed  `code`                 |
|client_id              |Client ID |
|redirect_uri           |ログイン後にリダイレクトするURL |
|scope                  |スペースで区切ったアクセス許可のリスト |
|state                  |CSRF対策の任意の文字列 |
|access_type            |`online` or `offline` |
|prompt                 | |
|login_hint             | |
|include_granted_scopes | |

#### Response fields

|Field                  |Description            |
|:----------------------|:----------------------|
|code                   |認証コード  |


### Handling the OAuth 2.0 server response

```text:EndPoint(POST)
https://www.googleapis.com/oauth2/v4/token
```

#### Parameter

|Parameter              |Value                  |
|:----------------------|:----------------------|
|code                   |ログイン後のリダイレクトによって受け取る認証コード |
|client_id              |Client ID |
|client_secret          |Client Secret |
|redirect_uri           |ログイン後にリダイレクトするURL |
|grant_type             |Fixed  `authorization_code` |

#### Response fields

|Field                  |Description            |
|:----------------------|:----------------------|
|access_token           |アクセストークン |
|refresh_token          |リフレッシュトークン |
|expires_in             |アクセストークンの有効時間 |
|token_type             |Fixed  `Bearer` |


### Using a refresh token

ログインのフローからは外れますが、アクセストークンの有効期限が失効した場合、リフレッシュトークンを使って、アクセストークンを再発行することができます。

```text:EndPoint(POST)
https://www.googleapis.com/oauth2/v4/token
```

#### Parameter

|Parameter              |Value                  |
|:----------------------|:----------------------|
|refresh_token          |リフレッシュトークン |
|client_id              |Client ID |
|client_secret          |Client Secret |
|grant_type             |Fixed  `refresh_token`|

#### Response fields

|Field                  |Description            |
|:----------------------|:----------------------|
|access_token           |アクセストークン|
|expires_in             |アクセストークンの有効時間 |
|token_type             |Fixed  `Bearer` |

## 参考

* [OAuth2.0によるGoogle+ APIのアクセス方法] (https://www.eisbahn.jp/yoichiro/2011/10/oauth2-0_google-api.html)


# LINE

## Official

* [LINE Developers] (https://developers.line.me/)
* [LINE BUSINESS CENTER] (https://business.line.me/ja/)
* [LINE Login] (https://developers.line.me/line-login/overview)
* [Integrating Web Login] (https://developers.line.me/web-api/integrating-web-login)

## Endpoint

### 認証コードの取得

```text:EndPoint
https://access.line.me/dialog/oauth/weblogin
```

#### Parameter

|Parameter              |Value                  |
|:----------------------|:----------------------|
|response_type          |Fixed  `code` |
|client_id              |Channel ID |
|redirect_uri           |ログイン後にリダイレクトするURL |
|state                  |CSRF対策の任意の文字列 (optional) |

#### Response fields

|Field                  |Description            |
|:----------------------|:----------------------|
|code                   |ログイン後のリダイレクトによって受け取る認証コード。発行されてから10分間有効 |
|state                  |認証コード取得時に指定した任意の文字列 |

### アクセストークンの取得

```text:EndPoint(POST)
https://api.line.me/v1/oauth/accessToken
```

#### Parameter

|Parameter              |Value                  |
|:----------------------|:----------------------|
|grant_type             |Fixed  `authorization_code` |
|client_id              |Channel ID |
|client_secret          |Channel Secret |
|code                   |ログイン後のリダイレクトによって受け取る認証コード |
|redirect_uri           |ログイン後にリダイレクトするURL |

#### Response fields

|Field                  |Description            |
|:----------------------|:----------------------|
|mid                    |ユーザーID |
|access_token           |アクセストークン |
|expires_in             |アクセストークンの有効期限 |
|refresh_token          |リフレッシュトークン |
|scope                  |Fixed null |

### アクセストークンの再発行

ログインフローからは外れますが、リフレッシュトークンを使用してアクセストークンを再発行することができます。

```text:EndPoint(POST)
https://api.line.me/v1/oauth/accessToken
```

#### Parameter

|Parameter              |Value                  |
|:----------------------|:----------------------|
|refreshToken           |リフレッシュトークン     |

#### Response fields

JSONフォーマット

|Field                  |Description            |
|:----------------------|:----------------------|
|mid                    |ユーザーID |
|accessToken            |アクセストークン |
|expire                 |アクセストークンの有効期限 |
|refreshToken           |リフレッシュトークン |


## 参考

* [【Rails4, OmniAuth】世界一丁寧なLINE LOGIN導入講座 - Qiita] (http://qiita.com/YuitoSato/items/a9e613370f418d5c322c)


# OAuth

## OAuth 1.0

* [RFC5849 - The OAuth 1.0 Protocol] (https://tools.ietf.org/html/rfc5849)

**参考**

* [OAuth 1.0 のほうが OAuth 2.0 より安全なの？ - Qiita] (http://qiita.com/TakahikoKawasaki/items/3600b28af7b63671b968)

## OAuth 2.0

* [RFC6749 - The OAuth 2.0 Authorization Framework] (https://tools.ietf.org/html/rfc6749)

**参考**

* [なぜか動かない！OAuth連携するサイトの開発で意外と見落としがちなこと - Qiita] (http://qiita.com/laqiiz/items/bf97b20b168d42d63627)
* [Java(SpringBoot)でTOTP(Time-based One-time Password),twitter/facebookログインを実現する - Qiita] (http://qiita.com/uzresk/items/03308cf1c24ee1576b7d)
* [OAuth認証について - SlideShare] (http://www.slideshare.net/yoshifumisato0521/oauth-14463927)


# Java Library

* [Spring Social] (http://projects.spring.io/spring-social/)
* [Apache Oltu] (https://oltu.apache.org/)
* [scribejava] (https://github.com/scribejava/scribejava)
* [Twitter4J] (http://twitter4j.org/ja/index.html)
* [Facebook4J] (http://facebook4j.github.io/ja/index.html)


# 関連記事

* [Apache Oltuを使ったOAuth認証のサンプルコード] (http://qiita.com/rubytomato@github/items/96391b3c0e4a305b74fe)
* [Spring BootとScribe OAuth Libraryでソーシャルログイン機能を実装する] (http://qiita.com/rubytomato@github/items/e6d7ed0d25a3835bf44b)