# ユーザーを管理する

このトピックでは、以下のユーザー管理タスクの実行方法について説明します。

安全にログインを処理する

安全にユーザー登録およびログインを処理する方法については、「アプリとサーバーの間で安全なログインプロセスを構築する」を参照してください。

# ユーザープロフィールを取得する

Scope.PROFILEスコープを指定してログインリクエストを送信すると、ユーザーのLINEプロフィールを取得できます。ユーザープロフィールには、ユーザーID、表示名、プロフィールメディア(画像または動画)、およびステータスメッセージが含まれます。

LineApiClient.getProfile()メソッドを以下のように呼び出します。

LineProfile profile = lineApiClient.getProfile().getResponseData()
Log.i(TAG, profile.getDisplayName());
Log.i(TAG, profile.getUserId());
Log.i(TAG, profile.getStatusMessage());
Log.i(TAG, profile.getPictureUrl().toString());

getDisplayName()メソッド、getPictureURL()メソッド、およびgetStatusMessage()メソッドでは、ログイン時の値が取得されますが、ユーザーはLINEに設定したこれらの値をいつでも変更できます。ユーザーを識別するには、getUserId()メソッドを使用します。このメソッドでは、変更できないユーザーIDが返されます。

ユーザープロフィールの画像サイズは、URLにサフィックスを付加することによって変更できます。

画像サイズ サフィックス
200 x 200 /large
51 x 51 /small

# IDトークンを使ってユーザーを識別する

OpenID Connect (opens new window) 1.0仕様は、OAuth 2.0プロトコル上に付与されるアイデンティティレイヤーです。OpenID Connectを使えば、LINEプラットフォームと安全に情報を交換できます。現在は、OpenID Connect仕様に準拠するIDトークンを発行する方式で、LINEプラットフォームからユーザープロフィールとメールアドレスを取得できます。

# メールアドレス取得権限を申請する

LINEログインを使ってログインするユーザーに、メールアドレスを取得する権限をアプリに付与するよう要求できます。これを行うには、LINE Developersコンソールで権限を申請します。詳しくは、『LINEログインドキュメント』の「メールアドレス取得権限を申請する」を参照してください。

# OpenIDとメールアドレスのスコープを指定したログイン

メールアドレス取得権限を付加したチャネルでは、以下のように、Scope.OPENID_CONNECTスコープとScope.OC_EMAILスコープを指定してユーザーにログインさせ、IDトークンからユーザーのメールアドレスを取得できます。

import java.util.Arrays;

private static final int REQUEST_CODE = 1;

LineAuthenticationParams params = new LineAuthenticationParams.Builder()
				        .scopes(Arrays.asList(Scope.OPENID_CONNECT, Scope.OC_EMAIL))
				        .build();

Intent loginIntent = LineLoginApi.getLoginIntent(
	            view.getContext(), 
	            Constants.CHANNEL_ID, 
	            params);

startActivityForResult(loginIntent, REQUEST_CODE);

IDトークンは署名付きのJSONウェブトークン (opens new window)です。不正なデータを防ぐため、LINE SDKによってIDトークンの署名と有効期限が検証されます。検証が成功すると、以下のようにonActivityResult()コールバックでLineIdTokenインスタンスを取得できます。

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode != REQUEST_CODE) {
        Log.e("ERROR", "Unsupported Request");
        return;
    }

    LineLoginResult result = LineLoginApi.getLoginResultFromIntent(data);

    switch (result.getResponseCode()) {
        case SUCCESS:     
            // Login successful
            LineIdToken lineIdToken = result.getLineIdToken();
            Log.v("INFO", lineIdToken.getEmail());
    ...
    }
}    

# IDトークンをバックエンドサーバーで利用する

ユーザーのなりすまし

アプリからバックエンドサーバーに送信されたユーザーIDなどの情報を、信用しないでください。悪意のあるクライアントは、任意のユーザーになりすますために、任意のユーザーIDや不正な情報をバックエンドサーバーに送信できます。

ユーザーIDなどの情報を送信する代わりに、生のIDトークンを送信してください。LINEが提供するAPIでIDトークンを検証すると、バックエンドサーバーでユーザーIDなどの情報を取得できます。

# 生のIDトークンを送信する

Scope.OPENID_CONNECTスコープを指定してLINEログインする場合は、nonceパラメータに任意の値を指定できます:

private static final int REQUEST_CODE = 1;
...
LineAuthenticationParams params = new LineAuthenticationParams.Builder()
                                  ...
                                  .nonce("<a randomly-generated string>")
                                  .build();

Intent loginIntent = LineLoginApi.getLoginIntent(
                        view.getContext(), 
                        Constants.CHANNEL_ID, 
                        params);

startActivityForResult(loginIntent, REQUEST_CODE);

nonceを省略した場合は、LINE SDKによって自動的に値が指定されますが、ランダムに生成したnoncenonceパラメータに指定することをお勧めします。ここで指定したnonceは、LINEログインAPIを使用してIDトークンを検証するときに使用します。nonceを利用してIDトークンを検証することは、リプレイアタック (opens new window)の防止に役に立ちます。

Scope.OPENID_CONNECTスコープを指定したLINEログインに成功すると、以下のコードで、IDトークンの元になった生のIDトークンを取得できます:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    ...
    LineLoginResult result = LineLoginApi.getLoginResultFromIntent(data);

    switch (result.getResponseCode()) {
        case SUCCESS:     
            // Login successful
            LineIdToken lineIdToken = result.getLineIdToken();
            String idTokenStr = lineIdToken.getRawString();
            if (idTokenStr != null) {
                // Send `idTokenStr` to your server.
            } else {
                // Something went wrong. You should fail the login.
            }
    ...
}

IDトークンを検証するために、このコードで取得したidTokenStrをバックエンドサーバーに送信してください。

# バックエンドサーバーでIDトークンを検証する

バックエンドサーバーで生のIDトークンを受信したら、受信したIDトークンと対応するnonceを、LINEが提供するIDトークン検証用のエンドポイントに送信して検証してください。IDトークンが有効な場合は、IDトークンクレームを含むJSON形式のオブジェクトが返されます。

バックエンドサーバーで利用するAPIについては、以下を参照してください。

# ユーザーデータを慎重に扱う

ユーザーの機密情報をプレーンテキストでアプリやサーバーに保存したり、セキュリティで保護されていないHTTP通信で転送したりしないでください。アクセストークン、ユーザーID、ユーザー名など、IDトークンに含まれるデータは機密情報に該当します。LINE SDKではユーザーのアクセストークンが保存されます。必要に応じて、認可後に以下のコードでアクセストークンを取得できます。

LineAccessToken accessToken = lineApiClient.getCurrentAccessToken().getResponseData();

IDトークンはログイン時にのみ発行されます。IDトークンを更新するには、ユーザーに再ログインさせる必要があります。ただし、ログインリクエストにScope.PROFILEスコープを指定する場合は、LineApiClient.getProfile()メソッドを呼び出してユーザーのプロフィール情報を取得できます。

# ユーザーをログアウトする

アプリからユーザーをログアウトさせることができます。より良いユーザー体験のために、ユーザーがアプリからログアウトする手段を提供することをお勧めします。

アクセストークンを無効化してユーザーをアプリからログアウトするには、logout()メソッドを呼び出します。アクセストークンを無効にすると、ユーザーはアプリからログアウトされます。ログアウトした後に再度ログインするには、ユーザーは再度ログインプロセスを行う必要があります。

lineApiClient.logout();