Riiiverへのログイン・認証について

Riiiverへのログインについて

Riiiverシステムを利用するには、Riiiverシステムにログインを行う必要があります。

つまり、アプリを利用するのにベンダシステムにログインする必要があるケースでは、ユーザはRiiiverシステムを利用するために以下の2回のログインを行う必要があります。

  1. ベンダシステムへのログイン
  2. Riiiverシステムへのログイン

これはユーザにとってわかりにくいため、Riiiverシステムは次の3つの方法による暗黙のログインを許容しています。

  1. ベンダシステム発行のIDトークンを使った認証(認証連携)
  2. Facebook ログインによる連携
  3. Google SignInによる連携

上記3つのいずれの方法もとれない場合は、ログイン画面を表示して、認証を行うこともできます。

ログイン画面

UIにより提供されている機能は、ユーザ認証(ログイン)、アカウント作成、パスワードリマインダリの3つです。

ログインは以下の3通りのいずれかの方法で行うことができます。

  1. ID/パスワードの入力
  2. Facebook ログイン
  3. Google SignIn

暗黙のログインまたは画面によるログインのいずれの場合においても、FacebookまたはGoogleによるログインで、Riiiverアカウントが存在しないケースでは、自動的にRiiiverアカウントが作成されます。

画面フロー

Facebook, Google へのアプリ登録について

Facebook Login, Google SignInを利用するため、FacebookおよびGoogle Cloud Platformにアプリの登録を行う必要があります。

これらのアプリに関する情報をRiiiverシステムに登録することで、RiiiverシステムでFacebookログイン, Google SignInを利用できるようになります。

Facebook アプリは、Facebookの「アプリを管理」から登録ができます。
詳細は次のリンクを参照してください。

https://developers.facebook.com/docs/apps?locale=ja_JP

Riiiver システムに、取得したFacebookアプリのIDとシークレットを登録します。

Googleについても、Google Cloud Platformの登録が必要です。

Google Cloud Platformのコンソールにログインし、APIとサービスから認証情報を選び、認証情報を作成します。

詳細については次のリンクを参照してください。

https://support.google.com/cloud/answer/6158849?hl=ja

取得したクライアントIDをRiiiverシステムに登録します。

アクセストークンについて

ログインにより、アクセストークン/リフレッシュトークン/IDトークンを取得することができます。アクセストークン/IDトークンは、Json Web Tokenです。

取得したアクセストークンには有効期限があります。認証APIはアクセストークンのリフレッシュを行っていますので、システムコール毎に認証APIを呼び出すことで有効期限切れを回避できます。

認証方式について

ベンダシステムとの認証連携について

Riiiverシステムは、(1)ベンダシステムがOpenID Connectに準拠するIDトークン(Json Web Token)を発行する(2)必要な情報をRiiiverシステムに登録しているときに限り、ベンダシステムとの認証連携ができます。Riiiverシステムに登録が必要な情報は以下のとおりです。

  1. 署名検証に必要な公開鍵取得用のURLJson Web Key (jwk)か、pemを取得できる必要があります。
  2. issuerクレーム (iss)
  3. 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の指定が不正