Riiiverへのログインについて
Riiiverシステムを利用するには、Riiiverシステムにログインを行う必要があります。
つまり、アプリを利用するのにベンダシステムにログインする必要があるケースでは、ユーザはRiiiverシステムを利用するために以下の2回のログインを行う必要があります。
- ベンダシステムへのログイン
- Riiiverシステムへのログイン
これはユーザにとってわかりにくいため、Riiiverシステムは次の3つの方法による暗黙のログインを許容しています。
- ベンダシステム発行のIDトークンを使った認証(認証連携)
- Facebook ログインによる連携
- Google SignInによる連携
上記3つのいずれの方法もとれない場合は、ログイン画面を表示して、認証を行うこともできます。
ログイン画面
UIにより提供されている機能は、ユーザ認証(ログイン)、アカウント作成、パスワードリマインダリの3つです。
ログインは以下の3通りのいずれかの方法で行うことができます。
- ID/パスワードの入力
- Facebook ログイン
- Google SignIn
暗黙のログインまたは画面によるログインのいずれの場合においても、FacebookまたはGoogleによるログインで、Riiiverアカウントが存在しないケースでは、自動的にRiiiverアカウントが作成されます。
画面フロー
Facebook, Google へのアプリ登録について
Facebook Login, Google SignInを利用するため、FacebookおよびGoogle Cloud Platformにアプリの登録を行う必要があります。
これらのアプリに関する情報をRiiiverシステムに登録することで、RiiiverシステムでFacebookログイン, Google SignInを利用できるようになります。
Facebook アプリは、Facebookの「アプリを管理」から登録ができます。
詳細は次のリンクを参照してください。
Riiiver システムに、取得したFacebookアプリのIDとシークレットを登録します。
Googleについても、Google Cloud Platformの登録が必要です。
Google Cloud Platformのコンソールにログインし、APIとサービスから認証情報を選び、認証情報を作成します。
詳細については次のリンクを参照してください。
取得したクライアントIDをRiiiverシステムに登録します。
アクセストークンについて
ログインにより、アクセストークン/リフレッシュトークン/IDトークンを取得することができます。アクセストークン/IDトークンは、Json Web Tokenです。
取得したアクセストークンには有効期限があります。認証APIはアクセストークンのリフレッシュを行っていますので、システムコール毎に認証APIを呼び出すことで有効期限切れを回避できます。
認証方式について
ベンダシステムとの認証連携について
Riiiverシステムは、(1)ベンダシステムがOpenID Connectに準拠するIDトークン(Json Web Token)を発行する(2)必要な情報をRiiiverシステムに登録しているときに限り、ベンダシステムとの認証連携ができます。Riiiverシステムに登録が必要な情報は以下のとおりです。
- 署名検証に必要な公開鍵取得用のURLJson Web Key (jwk)か、pemを取得できる必要があります。
- issuerクレーム (iss)
- audienceクレーム (aud)
なお、ベンダシステムの発行するIDトークンには、emailクレームが含まれている必要があります。
認証APIのopenLoginメソッドにベンダシステムのIDトークンが与えられると、Riiiverシステムはトークンの検証を行います。
iOS/ ERAuthクラス
public func openLogin( viewController:UIViewController, webView: WKWebView, vendorToken: String?, deviceIds: [String]?, delegate: ERAuthWebViewDelegate?)
Android/ com.riiiver.auth.ERAuthクラス
public void openLogin( final Activity activity, final WebView webView, final String vendorToken, final List<String> deviceIds, final IERAuthWebViewDelegate delegate)
ベンダシステムのIDトークンを使用しない場合は、vendorTokenにnil(or null)を指定します。
IDトークンの検証フローは次のとおりです。
検証の結果、OKならRiiiverシステムの各種トークンを発行します。
Facebookログイン、Google SignIn対応デリゲートについて
FacebookまたはGoogle認証が選択されたとき認証APIはデリゲート(ERAuthDelegate)を呼び出して認証処理を行います。
デリゲートの実体はSDK利用者が実装を行う必要があります。サンプルソースコードを参考に実装を行なってください。
iOS版
public protocol ERAuthDelegate { func refreshFacebook(completion: @escaping (ERAuthFacebookResult) -> Void) func loginFacebook(viewController: UIViewController?, completion: @escaping (ERAuthFacebookResult) -> Void) func logoutFacebook() func refreshGoogle(completion: @escaping (ERAuthGoogleResult) -> Void) func loginGoogle(viewController: UIViewController?, completion: @escaping (ERAuthGoogleResult) -> Void) func logoutGoogle() func interceptApplication(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool func interceptApplication(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?, resumeSessionWithCompletionHandler:((Any?,Error?)->Void)?) -> Bool }
Android版 (com.riiiver.auth.IERAuthDelegate)
public interface IERAuthDelegate { void refreshFacebook(IERAuthFacebookCallback callback); void loginFacebook(Activity activity, IERAuthFacebookCallback callback); void logoutFacebook(); void refreshGoogle(IERAuthGoogleCallback callback); void loginGoogle(Activity activity, IERAuthGoogleCallback callback); void logoutGoogle(); boolean onActivityResult(final int requestCode, final int resultCode, final Intent data); }
- refreshFacebookFacebookにログイン済みかどうかをチェックし、Facebookのステータスと認証トークンを返します。
- loginFacebookFacebookへのログイン処理を行い、結果ステータスと認証トークンを返します。
- logoutFacebookFacebookからのログアウト処理を行います。
- refreshGoogleGoogleにログイン済みかどうかをチェックし、Googleのステータスと認証トークンを返します。
- loginGoogleGoogleへのログイン処理を行い、結果ステータスと認証トークンを返します。
- logoutGoogleGoogleからのログアウト処理を行います。
- interceptApplicationAppDelegateに記述するFacebook, Google認証からの復帰処理を行います。
ケース1) 暗黙のログイン
Facebookの場合のフロー(Googleの場合も同様です)
認証APIがデリゲートのrefreshFacebook(Googleの場合は、refreshGoogle)を呼び出し、結果得られたトークンをRiiiverシステムで検証、OKならトークンを返します。
このケースの場合は、認証画面は表示されません。
ケース2) ログイン画面からのログイン
Facebookの場合のフロー(Googleの場合も同様です)
認証画面でのFacebookログインを選択により、loginFacebookデリゲートを呼び出します。デリゲートで、Facebook SDKを用いた認証処理を行なってください。結果トークンをAPI側に返すと、Riiiverシステムはそれを用いた認証処理を行います。
設定について
認証APIを利用するには設定データの用意が必要です。設定データはJSONファイル(erconfiguration.json)で用意します。
{ "Version": "1.0", "FacebookSignIn": { "AppId": "2132116560376492", "Permissions": "public_profile, email" }, "GoogleSignIn": { "ClientId": "559411539788-id91omtt4ob5deq7131850r6jk88hvgm.apps.googleusercontent.com" }, "ERAuth":{ "Host" : "https://st-str.riiiver.com", "VendorID" : "CITIZEN", "AppName" : "CITIZEN" } }
FacebookSignInとGoogleSignInには、独自に取得した Facebook アプリのIDと Google Cloud Platformの認証情報を設定してください。VendorIDは、Riiiverシステムによって発行された「ベンダID」、AppNameには利用者が登録した「アプリ名」を指定します。
Hostは、ステージング環境を利用する場合は、https://st-str.riiiver.comを設定してください。(TBD)
- iOS版
erconfiguration.json として配置し、リソースバンドルに含める。
- Android版
rawリソースに配置する。
<プロジェクト>/src/main/res/raw/erconfiguration.json
Riiiverシステムに登録する項目
アプリ登録をするときに以下の情報を登録する必要があります。
- ベンダID(Riiiverシステムによって発行)
- アプリ名
- アプリアイコン
- iOSアプリURL (アプリストアでのアプリのダウンロード用URL)
- AndroidアプリURL (GooglePlayでのアプリのダウンロード用URL)
- FacebookアプリID
- Facebook シークレット
- Google Cloud Platform クライアントID
- 認証用カスタムスキーマ (com.riiiiver.<ベンダID>)
- 連携用カスタムスキーマ
これに加え認証連携を使う場合、ベンダシステムの認証に関する情報を登録します。
- 公開鍵のタイプ (jwk or pem)
- 公開鍵のダウンロード用URL
- issuerクレーム
- audienceクレーム
リファレンス
iOS版
認証(ERAuth)
ERAuth.sharedInstance.<メソッド>(…) で呼び出します。
- public func setupDelegate(_ delegate: ERAuthDelegate)
認証SDKにERAuthDelegateを設定します。 - public func isLoggedIn() -> Bool
ログイン済みの場合trueを返します。 - public func getEcoSystemId() -> String?
ログイン済みの場合にエコシステムIDを返します。未ログインの場合はnilです。 - public var vendorId : String (getのみ)
設定ファイルで指定されているvendorIdを取得します。 - public var appName : String
設定ファイルで指定されているappNameを取得します。 - public func openLogin(viewController:UIViewController, webView: WKWebView, vendorToken: String?, deviceIds: [String]?, delegate: ERAuthWebViewDelegate?)
ログイン画面をwebViewに表示します。
ベンダ連携を利用して認証を行う場合は、vendorTokenにベンダシステムから取得したidTokenを設定します。使わない場合はnilです。
deviceIdsに対応するデバイスIDを配列で指定します。
delegate.onCloseViewControllerがwebViewを閉じたときに呼ばれます。
delegate.onErrorがエラーが発生したときに呼ばれます。 - public func openStore(viewController:UIViewController, webView: WKWebView, vendorToken: String?, deviceIds: [String]?, delegate: ERAuthWebViewDelegate?)
ストア画面をwebViewに表示します。
ベンダ連携を利用して認証を行う場合は、vendorTokenにベンダシステムから取得したidTokenを設定します。使わない場合はnilです。
deviceIdsに対応するデバイスIDを配列で指定します。
delegate.onCloseViewControllerがwebViewを閉じたときに呼ばれます。
delegate.onErrorがエラーが発生したときに呼ばれます。
ストアには認証画面が含まれますが、openLoginで認証を行なっている場合、認証画面はスキップされ表示されません。 - public func getToken(completion: ((Error?,ERAuthToken?) -> Void)?)
アクセストークンを取得します。 - public func getIdToken(completion: ((Error?,ERAuthToken?) -> Void)?)
IDトークンを取得します。 - public func logout(completion: ((Error?) -> Void)?)
ログアウトを行います。 - public func changePassword(oldPassword: String, newPassword: String, completion: ((Error?)->Void)?)
パスワードの変更を行います。 - public func changeEmail(newEmail: String, completion: ((Error?)->Void)?)
メールアドレスの変更を行います。 - public func interceptApplication(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool
public func interceptApplication(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
public func interceptApplication(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?, resumeSessionWithCompletionHandler:((Any?,Error?)->Void)?) -> Bool
アプリのAppDelegate.swiftのapplcationメソッドに設定するフック処理です。
AppDelegateに以下の様に指定します。
func application(_ application: UIApplication, open url: URL, sourceApplication: String ? , annotation : Any) - > Bool { let result = ERSDKLogin.sharedInstance.interceptApplication( application, open: url, sourceApplication: sourceApplication, annotation: annotation) return result; } func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any] ? ) - > Bool { // Override point for customization after application launch. let result = ERSDKLogin.sharedInstance.interceptApplication( application, didFinishLaunchingWithOptions: launchOptions) return result; }
ユーザ管理(ERUserManager)
ERUserManager.sharedInstance.<メソッド>(...)で呼び出します。
public func getUserProfile(completion:@escaping ((Error?,ERUserProfile?) -> Void))
ユーザプロフィールを取得します。public func setUserProfile(profile: ERUserProfile, completion:((Error?)->Void)?)
ユーザプロフィールを設定します。public func registerDevice(deviceId: String, completion:((Error?)->Void)?)
ユーザプロフィールに利用デバイスを登録します。openLoginまたはopenStoreのdeviceIdsにデバイスIDを設定することで対応できるため改めて利用する必要はありません。public func removeDevice(deviceId: String, completion:((Error?)->Void)?)
ユーザプロフィールから利用デバイスを除外します。
Android版
認証
ERAuth.getInstance().<メソッド>(...)で呼び出します。
public static void initialize(final Activity activity, IERAuthDelegate delegate, final IERAuthStartupCallback startupCallback)
初期化を行います。public String getVendorId()
設定ファイルで指定されているvendorIDを取得します。
public String getAppName()
設定ファイルで指定されているappNameを取得します。public String getEcoSystemId()
ログイン済みの場合にエコシステムIDを返します。未ログインの場合はnullです。public boolean isLoggedIn()
ログイン済みの場合にtrueを返します。public void getToken(final IERAuthGetTokenCallback callback)
ログイン済みの場合に、アクセストークンを取得します。public void getIdToken(final IERAuthGetTokenCallback callback)
ログイン済みの場合に、idトークンを取得します。public void logout(final IERAuthCallback callback)
ログアウト処理を行います。public void openLogin(final Activity activity, final WebView webView, final String vendorToken, final List<String> deviceIds, final IERAuthWebViewDelegate delegate)
ログイン画面をwebViewに表示します。 ベンダ連携を利用して認証を行う場合は、vendorTokenにベンダシステムから取得したidトークンを設定します。使わない場合はnullです。 deviceIdsに対応するデバイスIDをリストで指定します。 delegate.onCloseがwebViewを閉じた時に呼ばれます。 delegate.onErrorがエラーが発生したときに呼ばれます。public void openStore(final Activity activity, final WebView webView, final String vendorToken, final List<String> deviceIds, final IERAuthWebViewDelegate delegate)
ストア画面をwebViewに表示します。 ベンダ連携を利用して認証を行う場合は、vendorTokenにベンダシステムから取得したidトークンを設定します。使わない場合はnullです。 deviceIdsに対応するデバイスIDをリストで指定します。 delegate.onCloseがwebViewを閉じた時に呼ばれます。 delegate.onErrorがエラーが発生したときに呼ばれます。 ストアには認証画面が含まれますが、openLoginで認証を行なっている場合、認証画面はスキップされ表示されません。public void changePassword(final Activity activity, final String oldPassword, final String newPassword, final IERAuthCallback callback)
パスワードを変更します。public void changeEmail(final Activity activity, final String newEmail, final IERAuthCallback callback)
メールアドレスを変更します。public void onActivityResult(final int requestCode, final int resultCode, final Intent data)
ActivityのonActivituResultからこちらを呼び出すようにします。@Override protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { super.onActivityResult(requestCode, resultCode, data); ERAuth.getInstance().onActivityResult(requestCode, resultCode, data); }
ユーザ管理
ERUserManager.getInstance().<メソッド>(...)で呼び出します。
public static void initialize() 初期化処理を行います。
public void getUserProfile(final IERUserGetProfileCallback callback) ユーザプロフィールを取得します。
public void setUserProfile(final ERUserProfile profile, final IERUserSetProfileCallback callback) ユーザプロフィールを設定します。
public void registerDevice(final String deviceId, final IERUserRegisterDeviceCallback callback) ユーザプロフィールに利用デバイスを登録します。openLoginまたはopenStoreのdeviceIdsにデバイスIDを設定することで対応できるため改めて利用する必要はありません。
public void removeDevice(final String deviceId, final IERUserRemoveDeviceCallback callback) ユーザプロフィールから利用デバイスを除外します。
エラーについて
iOS版
ERAuthError
noSession
securityError(status: OSStatus)
internalError
serverError(detail: JSON)
userCanceled
noAuthDelegate
noSession セッション情報がありません。
securityError キーチェーンのアクセスでエラーが発生しました。 ステータスコードについては、OSStatusを参照してください。
internalError 通常は発生しません。(SDKの不具合等で発生することがあります。)
serverError サーバーでエラーが発生しました。
userCanceled ユーザーの入力によって中止されました。
noAuthDelegate AuthDelegateが設定されていません。
Android版
ERAuthSecurityError
ERAuthServerError
ERAuthError
ERAuthSecurityError キーチェーンのアクセスでエラーが発生しました.
ERAuthServerError サーバーでエラーが発生しました。
ERAuthError 上記2つ以外のエラーが発生しました。
エラーコード一覧(iOS, Android共通)
detail: { errcode: < エラー区分 > code: < コード値 optional > , message: < エラーメッセージ > }
エラー区分 | エラー内容 |
---|---|
1001 | パラメタエラー |
1002 | DBエラー |
1003 | セッションエラー |
1004 | サーバーエラー |
1005 | サーバーエラー |
1006 | サーバーエラー |
1011 | サーバーエラー(DB) |
1012 | DBエラー |
1013 | セッションエラー |
9998 | 内部エラー |
9999 | システムエラー |
コード値 | エラー内容 |
---|---|
100101 | 不正なデバイスIDが指定された |
100102 | 未登録のベンダIDが指定された |
100103 | 不正なベンダIDが指定された |
100104 | PEMが登録されていない |
100105 | クッキーが設定されていない |
100106 | 不正なアプリ名が指定された |
100107 | 未対応のユーザーエージェントが指定された |
100108 | 不正なレシピIDが指定された |
100109 | 不正なカテゴリIDが指定された |
100110 | 不正なツールIDが指定された |
100111 | 不正なリージョンIDが指定された |
100112 | メールアドレスが登録と一致していない |
100113 | ユーザが登録されていない |
100114 | メールアドレスが指定されていない |
100115 | パスワードが指定されていない |
100116 | メールアドレスの書式が正しくない |
100117 | パスワードの書式が正しくない |
100118 | 署名が正しくない |
100119 | SIGNUPパラメタが正しくない |
100120 | 誕生日が正しくない |
100121 | 性別が正しくない |
100122 | FACEBOOK IDが正しくない |
100123 | GOOGLE_IDが正しくない |
100124 | 国の指定が正しくない |
100126 | パラメタが足りていない |
100127 | メールアドレスの変更は許可されていない |
100128 | パスワードの変更は許可されていない |
100129 | 指定の文字列は長すぎる |
100130 | メールアドレスがすでに登録済みでで使用できない |
100301 | トークンの有効期限が切れている |
100302 | 不正なトークンが使用された |
100303 | トークンが有効期間外 |
101301 | トークンを認可できない |
101302 | 不正なトークンが使用された |
101303 | トークンの検証に失敗した |
101304 | Authorization Headerの指定が不正 |