Androidアプリ(Authorization Codeフロー)
AndroidのAuthorization Codeフローのサンプルコードの説明をします。
-
サポートバージョン
- Android 4.4(API Level 19)以降
-
SDK&サンプルコード
セキュリティ強化のお知らせに記載の通り、Yahoo! JAPANのシステムは「TLS1.0」および「TLS1.1」のサポートを終了するため、TLS1.2未対応のブラウザーではログインができなくなります。
また、Android 4.4(API Level 19)をサポートする場合は
Android Developpersの手順に従って、アプリでセキュリティプロバイダのアップデートを実装してください。
ライブラリーをインポートする
Yahoo! ID連携 Android SDKを任意の場所にダウンロードして解凍してください。以下のjarファイルにはYahoo! ID連携を利用するために必要なクラスが定義されています。インポートしてご利用ください。
- jp.co.yahoo.yconnect
- jp.co.yahoo.yconnect.core
Manifest.xmlの設定
はじめにManifext.xmlにパーミッションとintent-filterを設定します。
まずはアプリケーションでネットワークソケットのパーミッションを設定します。
Manifest.xml |
...
‹uses-permission android:name="android.permission.INTERNET"›‹/uses-permission›
...
|
次にコールバックURLを処理するためのintent-filterを設定します。
Manifest.xml |
...
‹activity
android:name="jp.co.yahoo.yconnect.sample.YConnectExplicitSDKActivity"
android:label="@string/explicit_app_name"
android:launchMode="singleTask" ›
‹intent-filter›
‹action android:name="android.intent.action.VIEW" /›
‹category android:name="android.intent.category.DEFAULT" /›
‹category android:name="android.intent.category.BROWSABLE" /›
‹data android:scheme="yj-xxxxx" /›
‹/intent-filter›
‹/activity›
...
|
今回はひとつのActivityでブラウザーの起動とコールバックURLの受け取りをするのでsingleTaskにしています。
android:launchMode="singleTask" |
Activityを起動するためのschemeを指定します。
このschemeはアプリケーションID登録時に発行されるカスタムURIスキーム「yj-xxxxx」を指定してください。
(カスタムURIスキームはアプリケーションの管理から変更可能です)
‹data android:scheme="yj-xxxxx" /› |
Authorizationエンドポイントにリクエストして同意画面を表示する
YConnectExplictiクラスにはAuthorization Codeフローで必要なメソッドがすべて実装されています。
YConnectExplicitクラスを使ってブラウザーを起動して同意画面を表示させます。
YConnectExplicitクラス
メソッド |
説明 |
public static YConnectExplicit getInstance() |
シングルトンパターンのインスタンスを取得する。 |
public void init(String clientId, String redirectUri, String state, String display, String[] prompt, String[] scope, String nonce) |
各パラメーターを設定する。 |
public void requestAuthorization(Activity activity) |
ブラウザーを起動して同意画面を表示する。 |
OIDCDisplayクラス
定数フィールド値 |
説明 |
public static final String DEFAULT |
パソコン版のテンプレートを表示するための定数です。 |
public static final String SMART_PHONE |
スマートフォン版のテンプレートを表示するための定数です。 |
OIDCPromptクラス
定数フィールド値 |
説明 |
public static final String DEFAULT |
ユーザーの認証、認可のための定数です。 |
public static final String NONE |
同意画面非表示のための定数です。(必須の場合はエラーが返却されます) |
public static final String CONSENT |
ユーザーの再認可のための定数です。 |
public static final String LOGIN |
ユーザーの再認証のための定数です。 |
OIDCScopeクラス
定数フィールド値 |
説明 |
public static final String OPENID |
ユーザー識別子を取得するための定数です。 |
public static final String PROFILE |
姓名・生年・性別を取得するための定数です。 |
public static final String EMAIL |
メールアドレスと確認済みフラグを取得するための定数です。 |
public static final String ADDRESS |
ユーザー登録住所情報を取得するための定数です。 |
YConnectExplicitActivity.java |
...
// アプリケーションID
private final static String clientId = "YOUR_APPLICATION_ID";
// コールバックURL
// (アプリケーションID発行時に登録したURI)
private final static String customUriScheme = "yj-xxxxx://cb";
...
// YConnectインスタンス取得
YConnectExplicit yconnect = YConnectExplicit.getInstance();
...
// 各パラメーター初期化
// リクエストとコールバック間の検証用のランダムな文字列を指定してください
String state = "44GC44GC54Sh5oOF";
// リプレイアタック対策のランダムな文字列を指定してください
String nonce = "U0FNTCBpcyBEZWFkLg==";
String display = OIDCDisplay.SMART_PHONE;
String[] prompt = { OIDCPrompt.DEFAULT };
String[] scope = { OIDCScope.OPENID, OIDCScope.PROFILE,
OIDCScope.EMAIL, OIDCScope.ADDRESS };
...
// 各パラメーターを設定
yconnect.init(clientId, redirectUri, state, display, prompt, scope, nonce);
// Authorizationエンドポイントにリクエスト
// (ブラウザーを起動して同意画面を表示)
yconnect.requestAuthorization(this);
...
|
実際の開発の際にはstate、nonceは固定の文字列ではなく独自の仕様でランダムな文字列を生成してデータベースなどに保存してください。stateはAuthorizationエンドポイントからのコールバックURL受け取り時に、nonceはIDトークンを復号時の検証に必要です。
各パラメーター値の詳細についてはAuthorizationエンドポイントを参照してください。
コールバックURLを受け取り、認可コードを抽出する
同意後に返されるコールバックURLをActivityで受け取り、認可コードなどを抽出します。
YConnectImplicitクラス
メソッド |
説明 |
public void parseAuthorizationResponse(Uri uri, String customUriScheme, String state) |
コールバックURLのフラグメントに付加されたパラメーターを抽出する。 |
public String getAuthorizationCode() |
認可コードを取得する。 |
YConnectExplicitActivity.java |
..
Intent intent = getIntent();
if(Intent.ACTION_VIEW.equals(intent.getAction())) {
// コールバックURLから各パラメーターを抽出
Uri uri = intent.getData();
yconnect.parseAuthorizationResponse(uri, customUriScheme, "abcxyz");
// 認可コードを取得
String code = yconnect.getAuthorizationCode();
...
}
...
|
Tokenエンドポイントにリクエストしてアクセストークンを取得する
取得した認可コードを用いてアクセストークンを取得します。
YConnectExplicitクラス
メソッド |
説明 |
public void requestToken(String code, String callbackUri, String clientId) |
Tokenエンドポイントにリクエストする。 |
public String getAccessToken() |
アクセストークンを取得する。 |
public long getAccessTokenExpiration() |
アクセストークンの有効期限を取得する。 |
public String getRefreshToken() |
リフレッシュトークンを取得する。 |
public String getIdToken() |
IDトークンを取得する。 |
非同期通信をするためメインスレッドとは別スレッドで実装する必要があります。
今回は簡易的なスレッドとしてAsyncTaskを継承したサブクラスでリクエストします。
YConnectExplicitAsyncTask.java |
...
// Tokenエンドポイントにリクエスト
yconnect.requestToken(code, redirectUri, clientId);
// アクセストークン、リフレッシュトークン、IDトークンを取得
final String accessTokenString = yconnect.getAccessToken();
final long expiration = yconnect.getAccessTokenExpiration();
final String refreshToken = yconnect.getRefreshToken();
final String idTokenString = yconnect.getIdToken();
...
|
CheckTokenエンドポイントにリクエストしてユーザー識別子を取得する
オプションでレスポンスタイプにIDトークンを指定した場合、IDトークンの暗号化された文字列が返されます。
この文字列をCheckTokenエンドポイントで復号し、ユーザー識別子やIDトークンの発行元などの情報を取得します。
YConnectExplicitクラス
メソッド |
説明 |
public void requestCheckToken(String idTokenString, String nonce, String clientId) |
CheckTokenエンドポイントにリクエストする。 |
public IdTokenObject getIdTokenObject() |
復号されたIDトークンをオブジェクトとして取得する。 |
非同期通信をするためメインスレッドとは別スレッドで実装する必要があります。
今回は簡易的なスレッドとしてAsyncTaskを継承したサブクラスでリクエストします。
YConnectExplicitAsyncTask.java |
...
// CheckTokenエンドポイントにリクエスト
yconnect.requestCheckToken(idTokenString, nonce, clientId);
// 復号されたIDトークン情報を取得
final IdTokenObject idtokenObject = yconnect.getIdTokenObject();
...
|
復号されたIDトークンはオブジェクト(JavaBeans形式)として返されます。各パラメーターはIDトークンオブジェクトのプロパティーに保持されているので、必要に応じてgetterで取り出して利用してください。
UserInfo APIにリクエストしてユーザー識別子を取得する
アクセストークンを用いてユーザー識別子などを取得します。
YConnectExplicitクラス
メソッド |
説明 |
public void requestUserInfo(String accessTokenString) |
UserInfo APIにリクエストする。 |
public UserInfoObject getUserInfoObject() |
UserInfoオブジェクトを取得する。 |
非同期通信をするためメインスレッドとは別スレッドで実装する必要があります。
今回は簡易的なスレッドとしてAsyncTaskを継承したサブクラスでリクエストします。
YConnectExplicitAsyncTask.java |
...
// UserInfo APIにリクエスト
yconnect.requestUserInfo(accessTokenString);
// UserInfo情報を取得
final UserInfoObject userInfoObject = yconnect.getUserInfoObject();
...
|
userInfoObjectはオブジェクト(JavaBeans形式)として返されます。各パラメーターはUserInfoオブジェクトのプロパティーに保持されているので、必要に応じてgetterで取り出して利用してください。
アクセストークンを更新する
リフレッシュトークンをつかって有効期限切れのアクセストークンを更新します。
YConnectExplicitクラス
メソッド |
説明 |
public void refreshToken(String refreshToken, String clientId) |
アクセストークンを更新する。 |
YConnectExplicitAsyncTask.java |
...
// エラーレスポンスが"Invalid_Token"であるかチェック
if(e.isInvalidToken()) {
...
// Tokenエンドポイントにリクエストしてアクセストークンを更新する
yconnect.refreshToken(refreshToken, clientId);
accessTokenString = yconnect.getAccessToken();
long expiration = yconnect.getAccessTokenExpiration();
...
}
...
|
アクセストークンなどの保存について
アクセストークン、IDトークン、UserInfo情報の保存は、悪意のある外部アプリケーションから盗みとられないように注意が必要です。
取得したトークンやユーザー情報を保存する場合には、適宜暗号化や難読化し外部から読み取られないようにしてください。
Androidアプリ(Implicitフロー・ブラウザー)
Androidのブラウザーを使用したImplicitフローのサンプルコードの説明をします。
-
サポートバージョン
- Android 4.4(API Level 19)以降
-
SDK & サンプルコード
セキュリティ強化のお知らせに記載の通り、Yahoo! JAPANのシステムは「TLS1.0」および「TLS1.1」のサポートを終了するため、TLS1.2未対応のブラウザーではログインができなくなります。
また、Android 4.4(API Level 19)をサポートする場合は
Android Developpersの手順に従って、アプリでセキュリティプロバイダのアップデートを実装してください。
ライブラリーをインポートする
Yahoo! ID連携 Android SDKを任意の場所にダウンロードして解凍してください。以下のjarファイルにはYahoo! ID連携を利用するために必要なクラスが定義されています。インポートしてご利用ください。
- jp.co.yahoo.yconnect
- jp.co.yahoo.yconnect.core
Manifest.xmlの設定
はじめにManifext.xmlにパーミッションとintent-filterを設定します。
まずはアプリケーションでネットワークソケットのパーミッションを設定します。
Manifest.xml |
...
‹uses-permission android:name="android.permission.INTERNET"›‹/uses-permission›
...
|
次にコールバックURLを処理するためのintent-filterを設定します。
Manifest.xml |
...
‹activity
android:name="jp.co.yahoo.yconnect.sample.YConnectImplicitSDKActivity"
android:label="@string/implicit_app_name"
android:launchMode="singleTask" ›
‹intent-filter›
‹action android:name="android.intent.action.VIEW" /›
‹category android:name="android.intent.category.DEFAULT" /›
‹category android:name="android.intent.category.BROWSABLE" /›
‹data android:scheme="yj-xxxxx" /›
‹/intent-filter›
‹/activity›
...
|
今回はひとつのActivityでブラウザーの起動とコールバックURLの受け取りをするのでsingleTaskにしています。
android:launchMode="singleTask" |
Activityを起動するためのschemeを指定します。
このschemeはアプリケーションID登録時に発行されるカスタムURIスキーム「yj-xxxxx」を指定してください。
(カスタムURIスキームはアプリケーションの管理から変更可能です)
‹data android:scheme="yj-xxxxx" /› |
Authorizationエンドポイントにリクエストして同意画面を表示する
YConnectImplictiクラスにはImplicitフローで必要なメソッドがすべて実装されています。
YConnectImplicitクラスを使ってブラウザーを起動して同意画面を表示させます。
YConnectImplicitクラス
メソッド |
説明 |
public static YConnectImplicit getInstance() |
シングルトンパターンのインスタンスを取得する。 |
public void init(String clientId, String redirectUri, String state, String display, String[] prompt, String[] scope, String nonce) |
各パラメーターを設定する。 |
public void requestAuthorization(Activity activity) |
ブラウザーを起動して同意画面を表示する。 |
OIDCDisplayクラス
定数フィールド値 |
説明 |
public static final String DEFAULT |
パソコン版のテンプレートを表示するための定数です。 |
public static final String SMART_PHONE |
スマートフォン版のテンプレートを表示するための定数です。 |
OIDCPromptクラス
定数フィールド値 |
説明 |
public static final String DEFAULT |
ユーザーの認証、認可のための定数です。 |
public static final String NONE |
同意画面非表示のための定数です。(必須の場合はエラーが返却されます) |
public static final String CONSENT |
ユーザーの再認可のための定数です。 |
public static final String LOGIN |
ユーザーの再認証のための定数です。 |
OIDCScopeクラス
定数フィールド値 |
説明 |
public static final String OPENID |
ユーザー識別子を取得するための定数です。 |
public static final String PROFILE |
姓名・生年・性別を取得するための定数です。 |
public static final String EMAIL |
メールアドレスと確認済みフラグを取得するための定数です。 |
public static final String ADDRESS |
ユーザー登録住所情報を取得するための定数です。 |
YConnectImplicitBrowserActivity.java |
...
// アプリケーションID
private final static String clientId = "YOUR_APPLICATION_ID";
// コールバックURL
// (アプリケーションID発行時に登録したURI)
private final static String customUriScheme = "yj-xxxxx://cb";
...
// YConnectインスタンス取得
YConnectImplicit yconnect = YConnectImplicit.getInstance();
...
// 各パラメーター初期化
// リクエストとコールバック間の検証用のランダムな文字列を指定してください
String state = "44GC44Ga44GrWeOCk+ODmuODreODmuODrShez4leKQ==";
// リプレイアタック対策のランダムな文字列を指定してください
String nonce = "KOOAjeODu8+J44O7KeOAjVlhaG9vISAo77yP44O7z4njg7sp77yPSkFQQU4=";
String display = OIDCDisplay.SMART_PHONE;
String[] prompt = { OIDCPrompt.DEFAULT };
String[] scope = { OIDCScope.OPENID, OIDCScope.PROFILE,
OIDCScope.EMAIL, OIDCScope.ADDRESS };
...
// 各パラメーターを設定
yconnect.init(clientId, redirectUri, state, display, prompt, scope, nonce);
// Authorizationエンドポイントにリクエスト
// (ブラウザーを起動して同意画面を表示)
yconnect.requestAuthorization(this);
...
|
実際の開発の際にはstate、nonceは固定の文字列ではなく独自の仕様でランダムな文字列を生成してデータベースなどに保存してください。stateはAuthorizationエンドポイントからのコールバックURL受け取り時に、nonceはIDトークンを復号時の検証に必要です。
各パラメーター値の詳細についてはAuthorizationエンドポイントを参照してください。
コールバックURLを受け取り、アクセストークンを抽出する
同意後に返されるコールバックURLをActivityで受け取り、アクセストークンなどを抽出します。
YConnectImplicitクラス
メソッド |
説明 |
public void parseAuthorizationResponse(Uri uri, String customUriScheme, String state) |
コールバックURLのフラグメントに付加されたパラメーターを抽出する。 |
public String getAccessToken() |
アクセストークンを取得する。 |
public long getAccessTokenExpiration() |
アクセストークンの有効期限を取得する。 |
public String getIdToken() |
IDトークンを取得する。 |
YConnectImplicitBrowserActivity.java |
...
Intent intent = getIntent();
if(Intent.ACTION_VIEW.equals(intent.getAction())) {
...
// コールバックURLから各パラメーターを抽出
Uri uri = intent.getData();
yconnect.parseAuthorizationResponse(uri, customUriScheme, state);
// アクセストークン、IDトークンを取得
String accessTokenString = yconnect.getAccessToken();
long expiration = yconnect.getAccessTokenExpiration();
String idTokenStr = yconnect.getIdToken();
...
}
...
|
CheckTokenエンドポイントにリクエストしてユーザー識別子を取得する
オプションでレスポンスタイプにIDトークンを指定した場合、IDトークンの暗号化された文字列が返されます。
この文字列をCheckTokenエンドポイントで復号し、ユーザー識別子やIDトークンの発行元などの情報を取得します。
YConnectImplicitクラス
メソッド |
説明 |
public void requestCheckToken(String idToken, String nonce, String clientId) |
CheckTokenエンドポイントにリクエストする。 |
public IdTokenObject getIdTokenObject() |
復号されたIDトークンをオブジェクトとして取得する。 |
非同期通信をするためメインスレッドとは別スレッドで実装する必要があります。
今回は簡易的なスレッドとしてAsyncTaskを継承したサブクラスでリクエストします。
YConnectImplicitBrowserAsyncTask.java |
...
// CheckTokenエンドポイントにリクエスト
yconnect.requestCheckToken(idTokenString, nonce, clientId);
// 復号されたIDトークン情報を取得
final IdTokenObject idtokenObject = yconnect.getIdTokenObject();
...
|
復号されたIDトークンはオブジェクト(JavaBeans形式)として返されます。各パラメーターはIDトークンオブジェクトのプロパティーに保持されているので、必要に応じてgetterで取り出して利用してください。
UserInfo APIにリクエストしてユーザー識別子を取得する
アクセストークンを用いてユーザー識別子などを取得します。
YConnectImplicitクラス
メソッド |
説明 |
public void requestUserInfo(String accessTokenString) |
UserInfo APIにリクエストする。 |
public UserInfoObject getUserInfoObject() |
UserInfoオブジェクトを取得する。 |
非同期通信をするためメインスレッドとは別スレッドで実装する必要があります。
今回は簡易的なスレッドとしてAsyncTaskを継承したサブクラスでリクエストします。
YConnectImplicitBrowserAsyncTask.java |
...
// UserInfo APIにリクエスト
yconnect.requestUserInfo(storedAccessToken);
// UserInfo情報を取得
final UserInfoObject userInfoObject = yconnect.getUserInfoObject();
...
|
userInfoObjectはオブジェクト(JavaBeans形式)として返されます。各パラメーターはUserInfoオブジェクトのプロパティーに保持されているので、必要に応じてgetterで取り出して利用してください。
アクセストークンの有効期限が切れた場合は、再度Authorizationエンドポイントにリクエストする
Implicitフローでアクセストークンの有効期限が切れた場合は、もう一度Authorizationエンドポイントにリクエストして、同意の処理を行ってください。
YConnectImplicitBrowserAsyncTask.java |
...
// エラーレスポンスが"Invalid_Token"であるかチェック
if(e.isInvalidToken()) {
...
String state = "44GC44Ga44GrWeOCk+ODmuODreODmuODrShez4leKQ==";
String nonce = "KOOAjeODu8+J44O7KeOAjVlhaG9vISAo77yP44O7z4njg7sp77yPSkFQQU4=";
String display = OIDCDisplay.SMART_PHONE;
String[] prompt = { OIDCPrompt.DEFAULT };
String[] scope = { OIDCScope.OPENID, OIDCScope.PROFILE,
OIDCScope.EMAIL, OIDCScope.ADDRESS };
...
yconnect.init(clientId, customUriScheme, state, display, prompt, scope, nonce);
yconnect.requestAuthorization(activity);
...
}
...
|
アクセストークンなどの保存について
アクセストークン、IDトークン、UserInfo情報の保存は、悪意のある外部アプリケーションから盗みとられないように注意が必要です。
取得したトークンやユーザー情報を保存する場合には、適宜暗号化や難読化し外部から読み取られないようにしてください。
Androidアプリ(Implicitフロー・WebView)
AndroidのWebViewを使用したImplicitフローのサンプルコードの説明をします。
-
サポートバージョン
- Android 4.4(API Level 19)以降
-
SDK&サンプルコード
セキュリティ強化のお知らせに記載の通り、Yahoo! JAPANのシステムは「TLS1.0」および「TLS1.1」のサポートを終了するため、TLS1.2未対応のブラウザーではログインができなくなります。
また、Android 4.4(API Level 19)をサポートする場合は
Android Developpersの手順に従って、アプリでセキュリティプロバイダのアップデートを実装してください。
ライブラリーをインポートする
Yahoo! ID連携 Android SDKを任意の場所にダウンロードして解凍してください。以下のjarファイルにはYahoo! ID連携を利用するために必要なクラスが定義されています。インポートしてご利用ください。
- jp.co.yahoo.yconnect
- jp.co.yahoo.yconnect.core
Manifest.xmlの設定
はじめにManifext.xmlにパーミッションとintent-filterを設定します。
まずはアプリケーションでネットワークソケットのパーミッションを設定します。
Manifest.xml |
...
‹uses-permission android:name="android.permission.INTERNET"›‹/uses-permission›
...
|
Authorizationエンドポイントにリクエストして同意画面を表示する
YConnectImplictiクラスにはImplicitフローで必要なメソッドがすべて実装されています。
YConnectImplicitクラスを使ってブラウザーを起動して同意画面を表示させます。
YConnectImplicitクラス
メソッド |
説明 |
public static YConnectImplicit getInstance() |
シングルトンパターンのインスタンスを取得する。 |
public void init(String clientId, String redirectUri, String state, String display, String[] prompt, String[] scope, String nonce) |
各パラメーターを設定する。 |
public Uri generateAuthorizationUri() |
リクエストURIを生成する。 |
OIDCDisplayクラス
定数フィールド値 |
説明 |
public static final String DEFAULT |
パソコン版のテンプレートを表示するための定数です。 |
public static final String SMART_PHONE |
スマートフォン版のテンプレートを表示するための定数です。 |
OIDCPromptクラス
定数フィールド値 |
説明 |
public static final String DEFAULT |
ユーザーの認証、認可のための定数です。 |
public static final String NONE |
同意画面非表示のための定数です。(必須の場合はエラーが返却されます) |
public static final String CONSENT |
ユーザーの再認可のための定数です。 |
public static final String LOGIN |
ユーザーの再認証のための定数です。 |
OIDCScopeクラス
定数フィールド値 |
説明 |
public static final String OPENID |
ユーザー識別子を取得するための定数です。 |
public static final String PROFILE |
姓名・生年・性別を取得するための定数です。 |
public static final String EMAIL |
メールアドレスと確認済みフラグを取得するための定数です。 |
public static final String ADDRESS |
ユーザー登録住所情報を取得するための定数です。 |
YConnectImplicitWebViewActivity.java |
...
// アプリケーションID
private final static String clientId = "YOUR_APPLICATION_ID";
// コールバックURL
// (アプリケーションID発行時に登録したURI)
private final static String customUriScheme = "yj-xxxxx://cb";
...
// 各パラメーター初期化
// リクエストとコールバック間の検証用のランダムな文字列を指定してください
String state = "5LiW55WM44GMWeODkOOBhCEh";
// リプレイアタック対策のランダムな文字列を指定してください
String nonce = "44Ki44Kk44OH44Oz44OG44Kj44OG44Kj44Gu5rW344Gv5bqD5aSn44Gg44KP";
String display = OIDCDisplay.SMART_PHONE;
String[] prompt = { OIDCPrompt.DEFAULT };
String[] scope = { OIDCScope.OPENID, OIDCScope.PROFILE,
OIDCScope.EMAIL, OIDCScope.ADDRESS };
...
// YConnectインスタンス取得
YConnectImplicit yconnect = YConnectImplicit.getInstance();
// 各パラメーター初期化
yconnect.init(clientId, customUriScheme, state, display, prompt, scope, nonce);
// リクエストURIを生成
Uri authorizationUri = yconnect.generateAuthorizationUri();
...
|
実際の開発の際にはstate、nonceは固定の文字列ではなく独自の仕様でランダムな文字列を生成してデータベースなどに保存してください。stateはAuthorizationエンドポイントからのコールバックURL受け取り時に、nonceはIDトークンを復号時の検証に必要です。
各パラメーター値の詳細についてはAuthorizationエンドポイントを参照してください。
WebViewに生成したURIを設定して読み込みます。
YConnectImplicitWebViewActivity.java |
...
WebView webView = (WebView)findViewById(R.id.webView);
webView.clearCache(true);
// WebViewクラスにstate、nonceを設定
webView.setWebViewClient(new YConnectImplicitWebViewClient(this));
webView.setWebChromeClient(new WebChromeClient());
webView.getSettings().setJavaScriptEnabled(true);
// WebViewを起動(ブラウザーを起動して同意画面を表示)
webView.loadUrl(authorizationUri.toString());
...
|
コールバックURLを受け取り、アクセストークンを抽出する
WebView内でコールバックURLを抽出するための処理をImplicitWebViewクラスで実装します。
ImplicitWebViewクラスはWebViewClientクラスを継承したサブクラスです。
onPageStartedメソッドでコールバックURLを受け取り、アクセストークンなどを抽出します。
YConnectImplicitクラス
メソッド |
説明 |
public void parseAuthorizationResponse(Uri uri, String customUriScheme, String state) |
コールバックURLのフラグメントに付加されたパラメーターを抽出する。 |
public String getAccessToken() |
アクセストークンを取得する。 |
public long getAccessTokenExpiration() |
アクセストークンの有効期限を取得する。 |
public String getIdToken() |
IDトークンを取得する。 |
YConnectImplicitWebViewClient.java |
...
if (url.startsWith(callBackUrl)) {
...
// コールバックURLから各パラメーターを抽出
Uri uri = Uri.parse(url);
yconnect.parseAuthorizationResponse(uri, customUriScheme, state);
// アクセストークン, IDトークンを取得
String accessTokenString = yconnect.getAccessToken();
long expiration = yconnect.getAccessTokenExpiration();
String idTokenString = yconnect.getIdToken();
...
}
...
|
CheckTokenエンドポイントにリクエストしてユーザー識別子を取得する
オプションでレスポンスタイプにIDトークンを指定した場合、IDトークンの暗号化された文字列が返されます。
この文字列をCheckTokenエンドポイントで復号し、ユーザー識別子やIDトークンの発行元などの情報を取得します。
YConnectImplicitクラス
メソッド |
説明 |
public void requestCheckToken(String idToken, String nonce, String clientId) |
CheckTokenエンドポイントにリクエストする。 |
public IdTokenObject getIdTokenObject() |
復号されたIDトークンをオブジェクトとして取得する。 |
非同期通信をするためメインスレッドとは別スレッドで実装する必要があります。
今回は簡易的なスレッドとしてAsyncTaskを継承したサブクラスでリクエストします。
YConnectImplicitWebViewAsyncTask.java |
...
// CheckTokenエンドポイントにリクエスト
yconnect.requestCheckToken(idTokenString, nonce, clientId);
// 復号されたIDトークン情報を取得
final IdTokenObject idtokenObject = yconnect.getIdTokenObject();
...
|
復号されたIDトークンはオブジェクト(JavaBeans形式)として返されます。各パラメーターはIDトークンオブジェクトの
プロパティーに保持されているので、必要に応じてgetterで取り出して利用してください。
UserInfo APIにリクエストしてユーザー識別子を取得する
アクセストークンを用いてユーザー識別子などを取得します。
YConnectImplicitクラス
メソッド |
説明 |
public void requestUserInfo(String accessTokenStr) |
UserInfo APIにリクエストする。 |
public UserInfoObject getUserInfoObject() |
UserInfoオブジェクトを取得する。 |
非同期通信をするためメインスレッドとは別スレッドで実装する必要があります。
今回は簡易的なスレッドとしてAsyncTaskを継承したサブクラスでリクエストします。
YConnectImplicitWebViewAsyncTask.java |
...
// UserInfo APIにリクエスト
yconnect.requestUserInfo(accessTokenString);
// UserInfo情報を取得
final UserInfoObject userInfoObject = yconnect.getUserInfoObject();
...
|
userInfoObjectはオブジェクト(JavaBeans形式)として返されます。各パラメーターはUserInfoオブジェクトのプロパティーに保持されているので、必要に応じてgetterで取り出して利用してください。
アクセストークンの有効期限が切れた場合は、再度Authorizationエンドポイントにリクエストする
Implicitフローでアクセストークンの有効期限が切れた場合は、もう一度Authorizationエンドポイントにリクエストして、同意の処理を行ってください。
YConnectImplicitWebViewAsyncTask.java |
...
// エラーレスポンスが"Invalid_Token"であるかチェック
if(e.isInvalidToken()) {
...
String state = "5LiW55WM44GMWeODkOOBhCEh";
String nonce = "44Ki44Kk44OH44Oz44OG44Kj44OG44Kj44Gu5rW344Gv5bqD5aSn44Gg44KP";
String display = OIDCDisplay.SMART_PHONE;
String[] prompt = { OIDCPrompt.DEFAULT };
String[] scope = { OIDCScope.OPENID, OIDCScope.PROFILE,
OIDCScope.EMAIL, OIDCScope.ADDRESS };
yconnect.init(clientId, customUriScheme, state, display, prompt, scope, nonce);
Uri authorizationUri = yconnect.generateAuthorizationUri();
webView.clearCache(true);
webView.setWebViewClient(new YConnectImplicitWebViewClient(activity));
webView.setWebChromeClient(new WebChromeClient());
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(authorizationUri.toString());
}
...
|
アクセストークンなどの保存について
アクセストークン、IDトークン、UserInfo情報の保存は、悪意のある外部アプリケーションから盗みとられないように注意が必要です。
取得したトークンやユーザー情報を保存する場合には、適宜暗号化や難読化し外部から読み取られないようにしてください。