api
OAuth
Line
oauth2
日本語訳

LINE Web Login v2 導入方法(日本語訳)

この記事は LINE Developers - Web API - Integrating Web Login のv2の日本語訳です。

2018/01/28追記:去年訳していた記事なのですが、今年に入ってLINE ログイン V2.1 のリリースとともに本家で翻訳が出てました (´・ω・`) 下書きの空きを作るために公開します。削除に忍びない

Web Login を導入する

このページは Web Login をあなたのサイトに導入する方法を説明します。Web Login はOAuth 2.0のプロトコル(通信仕様)を基本にしています。

現行バージョンと廃止バージョン

このページは Web Login の最新バージョンである Web Login v2 について説明しています。非推奨となっている Web Login v1 の仕様を参照したい場合はWeb Login v1(日本語訳)をごらんください。

注意: Web Login v1 のサポートは2018年1月までとなっています。そのため Web Login v2 の利用が推奨されています。

Web Login の流れ

API を呼び出すにはアクセス トークンが必要です。安全な認証と承認のため、ユーザーはLINE のドメインの「ログイン画面」上でログイン(認証)後、アクセス許可の同意(承認)を行います。その後、ユーザーがあなたのウェブサイトに転送されるとアクセストークンが取得できるようになります。以下は( API の呼び出しに必要な)アクセストークンを取得する流れです。

  1. ユーザーは、あなたのウェブサイトから LINE の「ログイン画面」に転送されます。
  2. ユーザーは LINE にログインし、あなたのウェブサイトのアクセス許可を同意(承認)します。
  3. 同意後、あなたのウェブサイトに承認コードと共にユーザーが逆転送(コールバック)されます。
  4. あなたのウェブサイトは LINE の承認サーバーに上記の承認コードを送りアクセストークンを要求します。
  5. LINE の承認サーバーは整合性を検証しアクセストークンを返します。

Line Login starterアプリケーション

LINE Login starter アプリケーションを利用すれば Java で簡単に LINE Login を試せます。LINE Login starter アプリケーションを使うには下記の GitHub のリポジトリをご覧ください。

要件

Web Loginをあなたのウェブサイトに導入するためには以下の情報の登録および取得が必須です。

  • Channel ID: あなたのチャンネル登録時に発行されたID。
  • Chennel secret: あなたのチャンネル登録時に発行された秘密鍵。
  • Callback URL: 認証後の転送先URLの事前登録。複数のURLを登録できます。

承認コードの取得

Web Login をあなたの ウェブサイトに導入するにあたり、まずは承認コードを取得する必要があります。

ログイン(認証と承認リクエスト)

承認コードを得るためには、ユーザーに「ログイン」リンクやボタンを押させ LINE の「ログイン画面」に転送させる必要があります。LINEの「ログイン画面」への転送先URLは以下の通りです。

https://access.line.me/dialog/oauth/weblogin?response_type=code&client_id={Channel ID}&redirect_uri={Callback URL}&state={State}

クエリのパラメーター

パラメータ名 データ型 必須 説明
response_type code String 必須 値は"code"です。これにより、LINEの承認サーバーに承認コードを返すように伝えます。
client_id Channel ID String 必須 LINEで発行されたChannel ID
redirect_uri Callback URL String 必須 認証と承認の後、処理をウェブサイトに戻すためにリダイレクトするURL。登録したChennelの管理画面で予め登録しておく必要があります。
state 何かしらの英数字の文字列 String 必須 一意のランダムな文字列。Callback URLに転送されたときに使われます。URLエンコードをしてはいけません。下記の注釈を参照してください。

注釈: クロス サイト リクエスト フォージェリ(CSRF)の脅威を避けるため、対策として LINE の「ログイン画面」への転送URL(承認リクエストURL)の生成時にランダムで一意の値を"state"パラメーターにセットし、転送の前後のセッション内で統合を行なってください。"state"パラメーターが設定されていない場合、自動ログインは動作しません。

ログイン認証のサンプルURL

以下は LINE の「ログイン画面」で認証と承認を行うURLのサンプルです。

https://access.line.me/dialog/oauth/weblogin?response_type=code&client_id=12345&redirect_uri=https%3A%2F%2Fsample.com%2Fauth&state=123abc

レスポンス(コールバック)

ユーザーがLINEのログイン認証と承認を行うと、ユーザーは認証のリクエストのURLでクエリに指定された(redirect_uriパラメーターの)URLへ転送されます。その際に、正常に認証および承認が行われた場合は以下のパラメーターを含んだクエリ付きで転送されます。

名前 データ型 説明
code String 結果を出力しアクセストークンを発行するために必須な文字列です。認証コードは10分間有効です。
state String 認証と承認リクエスト時に指定されたstateパラメータの文字列です。

レスポンスのサンプル

認証および承認が正常に行われた場合、ユーザーはcodeおよびstateパラメーターのクエリ付きでURLに転送されます。以下はレスポンス(コールバック)のサンプルです。

https://sample.com/callback?code=b5fd32eacc791df&state=123abc

エラー時のレスポンス(承認拒否時)

ユーザーが LINE にログイン(認証)後、ウェブサイトからのアクセスを許可(承認)しなかった場合は、以下のパラメーター付きのクエリでウェブサイトに転送されます。

名前 データ型 説明
error_description String 値は"The+user+has+denied+the+approval"です。注釈: このパラメーターは、iOSおよびAndroidアプリのアプリ内ブラウザには現れません。現在この問題は対策中です。
errorMessage String "DISALLOWED"
errorCode Integer "417"
state String 認証と承認リクエスト時に指定されたstateパラメータの文字列です。
error String "access_denied"

エラーレスポンスのサンプル

以下は認証および承認リクエストで承認されなかった(エラーがある)場合に、転送されるURLのサンプルです。

https://sample.com/{Callback URL}?error_description=The+user+has+denied+the+approval&errorMessage=DISALLOWED&errorCode=417&state=[state]&error=access_denied

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

APIの呼び出し

OAuth 2.0 の仕様
最新の Web Login の特徴は OAuth 2.0 の仕様に基づいています。もし非推奨の Web Login の仕様について知りたい場合は (Deprecated) Integrating Web Login を参照してください。

導入の手順

APIを利用するためにはアクセストークンが必要です。安全に認証を行うためにLINEのログイン・許可のためのページに移動し、認証の後、あなたのウェブサイトにリダイレクトしアクセストークンを取得できます。手順は以下のようになります。

  1. LINEのサイトに移動する
  2. ログイン・PINコード認証・許可画面が表示され、ユーザーが必要事項を入力し許可する
  3. 認証コードとともにウェブサイトにリダイレクトする
  4. アクセストークンを取得するためにウェブサイトのサーバーからLINEのサーバーに認証コードが送られる
  5. アクセストークンはAPIを利用するために用いられる

前提条件

ウェブサイトに LINE Web Login を導入するために、以下の情報が指定されなければなりません。

  • Channel
  • Channel Secret
  • Redirect URL

Channel ID と Channel Secret は、登録作業中に発行される識別子です。LINEのサイトでログイン・許可した後、処理がウェブサイトに戻ります。安全のために、LINE Developersでリダイレクトページを指定しなければなりません。複数のリダイレクトページを登録できます。この情報はチャンネルの作成処理中に段階を踏んで登録されます。

認証コードを取得する

ウェブサイトに LINE Web Login を導入する前に、認証コードを取得する必要があります。認証コードの取得方法は以下の通りです。

ログイン画面

LINEログインボタンが押されたとき、認証と承認のためにLINEのログイン画面にリダイレクトします。そのURLは以下の通りです。

https://access.line.me/dialog/oauth/weblogin?response_type=code&client_id={Channel ID}&redirect_uri={Redirect URL}&state={State}

パラメータは以下の通りで、すべて明記されなければなりません。

パラメータ名 データ型 説明
response_type codeで固定 String 必須
client_id Channel ID String LINEで発行されたChannel ID
redirect_uri Redirect URL String 認証と承認の後、処理をウェブサイトに戻すためにリダイレクトするURL
state 何かしらの英数字の文字列 String 任意です。Redirect URLにリダイレクトしたときに使われます。URLエンコードをしてはいけません。注釈を参照してください。

リダイレクトURLはチャンネル登録時に指定したURLと一致していなければなりません。比較対象はURLのスキーム(httphttps)からパス名(ディレクトリ名やファイル名)まで(要はGETパラメータより前の部分)で、パラメータの部分は比較対象にはなりません。パラメータの値はURLエンコードして指定してください。stateパラメータについては、文字列がリダイレクトURLにそのまま付与されます。stateパラメータはウェブサイトのセッションを維持するために使用され、CSRF対策にも有効です。セッションに対応した文字列がstateパラメータの値のように指定されます。リダイレクトURLに付与されるstateパラメータの値に関しては、ウェブサイト上でセッションに対応しているかどうかに応じて、その文字列は正しいことが確かめられます。そうすることで、同じ個人として LINE Web Login を導入するためにウェブサイトのユーザーと、認証と承認を行ったユーザーを識別することが可能になります。

注意
stateパラメータの文字列はLINEのページからリダイレクトする時にURLデコードされるので、URLエンコードされた文字列を使わないでください。これは既知の問題で、stateパラメータがOAuth 2.0プロトコルで指定されたように変わらずリダイレクトURLに付与されるために、私達はその修正を進めています。

ウェブサイトにリダイレクトする

認証と承認は一度だけ行われ、LINEのページから指定されたURLにリダイレクトします。結果はパラメータで与えられます。成功すると以下のパラメータが付与されます。

名前 データ型 説明
code String 結果を出力しアクセストークンを発行するために必須な文字列です。認証コードは10分間有効です。
state String 認証と承認で指定されたstateパラメータの文字列です。

例えば、以下のように認証と承認が行われたとします。

https://access.line.me/dialog/oauth/weblogin?response_type=code&client_id=12345&redirect_uri=https%3A%2F%2Fsample.com%2Fauth&state=123abc

成功したら、LINEのページから以下のページにリダイレクトします。CSRF対策で、手続きを確かめる事が必要です。

http://sample.com/callback?code=b5fd32eacc791df&state=123abc

失敗したら、以下のパラメータが付与されます。

名前 データ型 説明
errorCode Integer どんな種類のエラーにも割り当てられる値
errorMessage String 出力されるエラーの原因

以下のエラーコードとエラーメッセージが返ると思われます。

エラーコード エラーメッセージ 原因
417 DISALLOWED 許可ページでキャンセルボタンを押された

上記の例では、LINEのページから以下のURLにリダイレクトします。

http://sample.com/callback?errorCode=417&errorMessage=DISALLOWED

アクセストークンを取得する

認証と承認に成功したら、認証コードが発行されます。APIを利用する上で、アクセストークンを発行するために認証コードを使用します。アクセストークンは次のようなエンドポイントで発行されます。

リクエスト

HTTPメソッド エンドポイントURL 必須のリクエストハンドラ
POST https://api.line.me/v1/oauth/accessToken Content-Type: application/x-www-form-urlencoded

以下の情報が、formエンコード方式でリクエストで指定されます。

名前 データ型 説明
grant_type String 認証コードで固定
client_id String Channel ID
client_secret String チャンネル登録時に発行された Channel Secret
code String 取得した認証コード
redirect_uri String 認証コードを発行するときに提示したリダイレクトURL

例:

grant_type=authorization_code&code=b5fd32eacc791df&client_id=12345&client_secret=d6524edacc8742aeedf98f&redirect_uri=https%3A%2F%2Fsample.com%2Fauth

レスポンス

アクセストークンが正常に処理されると、以下の情報がJSON方式で返されます。

プロパティ データ型 説明
mid String 認証済みユーザーのID
access_token String アクセストークン文字列
expires_in Integer アクセストークンの正当性で、発行されてからの経過時間を示しています
refresh_token String 新しいアクセストークンにするときに必要なトークン文字列
scope nullで固定

結果は以下のように出力されます。

{
   "mid":"u668d5ad7e289428ef97d4ceb7841b0ad",
   "access_token":"bNl4YEFPI/hjFWhTqexp4MuEw5YPs7qhr6dJDXKwNPuLka...",
   "token_type":"Bearer",
   "expires_in":2591977,
   "refresh_token":"8iFFRdyxNVNLWYeteMMJ",
   "scope":null
 }

この情報はサーバーとAPIには必須です。より詳しい情報は、REST APIsを参照してください。

エラーレスポンス

エラーが発生したとき、以下のようなエラーレスポンスが返ると予想されます。

原因 HTTPステータスコード レスポンス
生成されていないリクエストトークンが指定された
すでにアクセストークンに変換されたリクエストトークンが指定された
404 {“error”:”412″,”error_description”:”TOKEN_NOT_FOUND:b5fd32eacc791df”}
期限切れのリクエストトークンが指定された 401 {“error”:”412″,”error_description”:”request token expired.”}
Channel IDで指定されたチャンネルに消費者資格情報がない 401 {“error”:”404″,”error_description”:”CONSUMER_CREDENTIAL_NOT_FOUND”}
指定されたChannel IDの使用が中止されている 401 403 {“error”:”405″,”error_description”:”REVOKED or SUSPENDED”}
{“error”:”418″,”error_description”:”CHANNEL_INACTIVE”}
指定されたChannel secretが一致しない 401 {“error”:”401″,”error_description”:”channel secret is not matched. maybe abusing?”}
指定されたChannel IDのチャンネルが存在しない 404 {“error”:”404″,”error_description”:”12345″}

APIを利用する

アクセストークンを取得すれば、REST APIを利用できます。より詳しい情報は、REST APIsをご覧ください。