- LINE Developers
- ドキュメントトップ
- LINEログイン
- ウェブ
- ウェブアプリにLINEログインを組み込む
ウェブアプリにLINEログインを組み込む
注:ここでは、OpenID Connectプロトコルをサポートし、ユーザー情報をIDトークンで取得できるLINEログインv2.1をウェブアプリに組み込む方法について説明します。ウェブアプリにLINEログインv2を組み込む場合は、「ウェブアプリにLINEログインを組み込む(LINEログインv2)」を参照してください。
このページでは、ウェブアプリにLINEログインを組み込む方法について説明します。LINEログインを組み込めるアプリがない場合は、サンプルアプリを利用できます。「ウェブアプリでLINEログインを試してみる」を参照してください。
ログインのフロー
ウェブアプリ向けのLINEログインの処理(ウェブログイン)は、OAuth 2.0の認可コード付与のフローとOpenID Connectプロトコルに基づいています。アプリでLINEログインを利用するには、アプリからサーバーへのリクエスト送信と、LINEプラットフォームからアプリへのデータ受信を実行できる必要があります。ウェブログインのフローの概要は以下のとおりです。
ウェブログインの処理に伴うステップは、以下のとおりです。
- 必要なクエリパラメータを使用して、アプリからLINEログインの認可URLにユーザーを誘導します。
- LINEのログインダイアログがブラウザで開き、ユーザーはログインして認証を受けます。LINEプラットフォームでユーザーの認証情報が検証された後、ユーザーはアプリから要求される権限を付与することに同意する必要もあります。
- LINEプラットフォームからアプリに、
redirect_uri
を介してユーザーをリダイレクトします。このとき、認可コードとstate
を含むクエリ文字列もアプリに送信されます。 - アプリは、認可コードを使ってエンドポイントURL
https://api.line.me/oauth2/v2.1/token
にアクセストークンを要求します。 - LINEプラットフォームがアプリからのリクエストを検証し、アクセストークンをアプリに返します。
取得したアクセストークンを使って、Social APIを呼び出すことができます。
始める前に
LINEログインをアプリに組み込む作業を始める前に、以下の作業が完了していることを確認します。
- アプリで使用するチャネルを作成する。
チャネルを設定する
リダイレクト先を設定する
ユーザーがログインした後のリダイレクト先を指定するには、コンソールの[アプリ設定]ページでコールバックURLを設定します。
注:複数のコールバックURLを指定できます。
メールアドレス取得権限を申請する
LINEログインを使ってログインするユーザーに、メールアドレスの取得を要求できます。この機能を有効にするには、あらかじめコンソールから申請する必要があります。
-
[チャネル基本設定]ページの[OpenID Connect]セクションで、[メールアドレス]の隣の[申請]をクリックします。
-
申請条件に同意して、メールアドレスの取得と利用についてユーザーに提示する文面のスクリーンショットをアップロードします。
申請が受理されると[メールアドレス]の下に「申請済み」と表示されます。
アクセストークンを取得する
アクセストークンを取得するには、認可コードを指定してHTTP POSTリクエストを実行します。取得したアクセストークンで、APIを呼び出すことができます。アクセストークンは、以下のエンドポイントで発行されます。
リクエスト
POST https://api.line.me/oauth2/v2.1/token
リクエストヘッダー | 説明 |
---|---|
Content-Type | application/x-www-form-urlencoded |
リクエストボディ
リクエストボディの情報はform-urlencodedフォーマットで記述します。
パラメータ | タイプ | 必須 | 説明 |
---|---|---|---|
grant_type |
String | 必須 |
authorization_code 。付与タイプを指定します。 |
code |
String | 必須 | 認可コード |
redirect_uri |
String | 必須 | コールバックURL |
client_id |
String | 必須 | チャネルID。コンソールで確認できます。 |
client_secret |
String | 必須 | チャネルシークレット。コンソールで確認できます。 |
リクエストの例
以下はアクセストークンを取得するためのHTTP POSTリクエストの例です。
curl -X POST https://api.line.me/oauth2/v2.1/token \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d 'grant_type=authorization_code' \
-d 'code=xxx' \
-d 'redirect_uri=xxx' \
-d 'client_id=xxx' \
-d 'client_secret=xxx'
レスポンス
LINEプラットフォームがアプリからのリクエストを検証し、以下の表に示すアクセストークンなどのデータをアプリに返します。
プロパティ | タイプ | 説明 |
---|---|---|
access_token |
String | アクセストークン。有効期間は30日です。 |
expires_in |
Number | アクセストークンの有効期限が切れるまでの秒数。 |
id_token |
String | ユーザー情報を含むJSONウェブトークン(JWT)。このプロパティは、スコープにopenid を指定した場合にのみ返されます。詳しくは、「IDトークン」を参照してください。 |
refresh_token |
String | 新しいアクセストークンを取得するためのトークン。アクセストークンの有効期限が切れてから最長10日間有効です。 |
scope |
String | ユーザーが付与する権限。ただし、email スコープは権限が付与されていてもscope プロパティの値としては返されません。 |
token_type |
String | Bearer |
以下は、JSONレスポンスの例です。
{
"access_token": "bNl4YEFPI/hjFWhTqexp4MuEw5YPs...",
"expires_in": 2592000,
"id_token": "eyJhbGciOiJIUzI1NiJ9...",
"refresh_token": "Aa1FdeggRhTnPNNpxr8p",
"scope": "profile",
"token_type": "Bearer"
}
IDトークン
IDトークンは、ユーザー情報を含むJSONウェブトークン(JWT)です。IDトークンは、ピリオド(.)で区切られたヘッダー、ペイロード、および署名から構成されます。各部分はbase64urlでエンコードされています。詳しくは、JWTの仕様を参照してください。
ヘッダー
以下はデコードしたヘッダー値の例です。この例では、エンコードされたオブジェクトでHMAC SHA-256アルゴリズムが使用されていることを、ヘッダー部分で宣言しています。LINEログインではHMAC SHA-256のみを使用します。
{
"alg": "HS256"
}
ペイロード
ユーザー情報はペイロード部分に含まれます。
フィールド | 説明 |
---|---|
iss |
https://access.line.me 。IDトークンの生成URLです。 |
sub | IDトークンの対象ユーザーID |
aud | チャネルID |
exp | トークンの有効期限。UNIXタイムです。 |
iat | IDトークンの生成時間。UNIXタイムです。 |
auth_time | ユーザー認証時間。UNIXタイムです。認可リクエストにmax_age の値を指定しなかった場合は含まれません。 |
nonce | 認可URLに指定したnonce の値。認可リクエストにnonce の値を指定しなかった場合は含まれません。 |
name | ユーザーの表示名。認可リクエストにprofile スコープを指定しなかった場合は含まれません。 |
picture | ユーザープロフィールの画像URL。認可リクエストにprofile スコープを指定しなかった場合は含まれません。 |
ユーザーのメールアドレス。認可リクエストにemail スコープを指定しなかった場合は含まれません。 |
以下はデコードしたペイロード部分の例です。
{
"iss": "https://access.line.me",
"sub": "U1234567890abcdef1234567890abcdef ",
"aud": "1234567890",
"exp": 1504169092,
"iat": 1504263657,
"nonce": "0987654asdf",
"name": "Taro Line",
"picture": "https://sample_line.me/aBcdefg123456"
}
署名
署名を使ってレスポンスの有効性を検証します。Base64urlでエンコードされているヘッダー、ピリオド、およびペイロードを繋げた文字列を値とし、チャネルシークレットを鍵として、HMAC SHA-256アルゴリズムでハッシュ化した値をbase64urlでエンコードしたのが署名です。アプリのセキュリティを保つため、トークンの署名は必ず検証する必要があります。
IDトークンをデコードして検証する
IDトークンをデコードして検証するには、任意のJWTライブラリを使うか、 以下の手順に従います。
JWTライブラリを使う
一般利用が可能なJWTライブラリを使って、IDトークンをデコードして検証できます。以下はPython®向けライブラリを使ってIDトークンをデコードする例です。
import jwt
decoded_id_token = jwt.decode(id_token,
channel_secret,
audience=channel_id,
issuer='https://access.line.me',
algorithms=['HS256'])
# check nonce (Optional. But strongly recommended)
nonce = '_stored_in_session_'
expected_nonce = decoded_id_token.get('nonce')
if nonce != decoded_id_token.get('nonce'):
raise RuntimeError('invalid nonce')
IDトークンをデコードして検証する
- ピリオド(.)を区切り文字として、ヘッダー、ペイロード、および署名を分割します。
- 各部分をbase64urlでデコードします。
- Base64urlでエンコードされたヘッダー、ピリオド、およびペイロードを繋げた文字列を値とし、チャネルシークレットを鍵として、ハッシュ値を算出します。この値がデコードした署名と同じであるかどうかを検証します。
-
iss
の値がhttps://access.line.meであり、IDトークンがLINEから送信されたものであることを確認します。 -
aud
の値がお使いのチャネルIDと一致しており、IDトークンがお使いのチャネルを対象としていることを確認します。 - IDトークンの有効性を確認するには、
exp
の値が検証時より後のUNIXタイムスタンプであることを確認します。 - リプレイアタックを防止するため、
nonce
の値が認可リクエストに指定したnonce
の値と等しいことを確認します。nonce
の値をユーザーセッションと共に保存します。このステップは省略できますが、nonce
の値を含めることを強くお勧めします。
以下はPython 3を使った例です。
import base64
import hashlib
import hmac
import json
import time
def base64url_decode(target):
rem = len(target) % 4
if rem > 0:
target += '=' * (4 - rem)
return base64.urlsafe_b64decode(target)
def check_signature(key, target, signature):
calc_signature = hmac.new(
key.encode('utf-8'),
target.encode('utf-8'),
hashlib.sha256
).digest()
return hmac.compare_digest(signature, calc_signature)
def decode_id_token(id_token, channel_id, channel_secret, nonce=None):
# step 1
header, payload, signature = id_token.split('.')
# step 2
header_decoded = base64url_decode(header)
payload_decoded = base64url_decode(payload)
signature_decoded = base64url_decode(signature)
# step 3
valid_signature = check_signature(channel_secret,
header + '.' + payload,
signature_decoded)
if not valid_signature:
raise RuntimeError('invalid signature')
payload_json = json.loads(payload_decoded.decode('utf-8'))
# step 4
if payload_json.get('iss') != 'https://access.line.me':
raise RuntimeError('invalid iss')
# step 5
if payload_json.get('aud') != channel_id:
raise RuntimeError('invalid aud')
# step 6
if int(time.time()) > payload_json.get('exp'):
raise RuntimeError('invalid exp')
# step 7 (Optional. But strongly recommended)
if nonce is not None:
if payload_json.get('nonce') != nonce:
raise RuntimeError('invalid nonce')
return payload_json
次のステップ
取得したアクセストークンを使ってSocial APIを呼び出し、ユーザーのログアウト、アクセストークンの管理、およびユーザープロフィール情報の取得を実行できます。詳しくは、以下のページを参照してください。