LoginSignup
1
0

More than 3 years have passed since last update.

HMS Account Kit実装入門(Authorization Code編)

Last updated at Posted at 2020-10-01

前書き

HMS Account Kit実装入門でIDトークンによるユーザー認証を紹介しました。本章はAuthorization Codeによるユーザー認証と、IDトークンによるユーザー認証との違いを紹介したいと思います。

前準備

AppGallery ConnectでAccount Kitの設定ページに入り、redirect_uriをセットします。サーバー側がユーザー情報をファーウェイのアカウントサーバーから取得する場合は設定しなければなりません(APIを呼び出すのに必須なパラメータであるため)。
スクリーンショット 2020-10-01 233255

実装

こちらはオフィシャルサイトに掲載されているシーケンス図です。
accountKitClientIdToken.png

各ステップに対応しているコード実装は下記に示します。

ステップ1

ユーザーが”HUAWEI IDでログイン”ボタンを押すというプロセスです。ボタンのデザインは細かく定められているので、オフィシャルページをご参照ください。
HUAWEI ID Sign-In Icon Specifications

ステップ2~4

”HUAWEI IDでログイン”ボタンが押されたときの処理です。

MyActivity.kt
private var authManager: HuaweiIdAuthService? = null

private fun signInAuthorizationCode() {
    val param = HuaweiIdAuthParamsHelper(HuaweiIdAuthParams.DEFAULT_AUTH_REQUEST_PARAM)
        .setAuthorizationCode()
        .createParams()
    authManager = HuaweiIdAuthManager.getService(activity, param)
    authManager?.let {
        startActivityForResult(it.signInIntent, REQUEST_CODE_SIGN_IN_AUTHORIZATION_CODE)
    }
}

ステップ5~6

HMS Account Kitの内部の認証済み確認処理とユーザーが明示的に認証を承認するプロセスです。こちらはコード実装不要です。

ステップ7~9

Authorization Codeとユーザーのアカウント情報はここで返ってきます。

MyActivity.kt
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    when (requestCode) {
        REQUEST_CODE_SIGN_IN_AUTHORIZATION_CODE -> {
            val authHuaweiIdTask = HuaweiIdAuthManager.parseAuthResultFromIntent(data)
            if (authHuaweiIdTask.isSuccessful) {
                // Authorization Code= authHuaweiIdTask.result.authorizationCode
                // ユーザー名 = authHuaweiIdTask.result.displayName
                // ユーザーのアバター画像のURL = authHuaweiIdTask.result.avatarUri
                // ユーザーのメールアドレス = authHuaweiIdTask.result.email
            }
        }
    }
}

ステップ10

サーバーにユーザー情報を渡すときにのみ必要です。

ステップ11~12

サーバーがユーザー情報をファーウェイのアカウントサーバーから取得する場合のみ実装が必要です。

ここでは2ステップがあります。

Authorization CodeによるIDトークンの取得
API(開発者):https://oauth-login.cloud.huawei.com/oauth2/v3/token
API(運営側):https://oauth-login-at.cloud.huawei.com/oauth2/v3/token
メソッド:POST
リクエストのパラメータ:

キー
grant_type "authorization_code"で固定
client_id AppGallery ConnectのMy AppsのApp informationのApp ID
client_secret AppGallery ConnectのMy AppsのApp informationのApp secret
code Authorization code
redirect_uri AppGallery ConnectにセットしたリダイレクトURI

レスポンスはJSONとなります。IDトークンはid_tokenに入っています。

詳細はこちらをご参照ください。
Obtaining an Access Token

スクリーンショット 2020-10-01 234024.png

IDトークンの解凍
IDトークンを解凍すれば、ゆーざー情報が得られます。解凍方法について、HMS Account Kit実装入門の”IDトークンの有効性検証”と”IDトークンの有効性検証とは?”をご参照ください。

Authorization Code認証とIDトークン認証の違い

Android観点

Androidの実装に焦点を当てれば、Authorization Code認証とIDトークン認証に違いがありません。行っていることが同じです。

サーバー観点

Authorization Code認証はIDトークン認証より1ステップが多いです。
Authorization Code認証では、まずAPIを通して、Authorization CodeをIDトークンに変えなければなりません。それ以降の処理はIDトークン認証と同じです。

セキュリティについて

そもそもIDトークン自体にユーザー情報が入っているので、暗号化したからとはいえ、IDトークンをクライアントからサーバーに渡すということ自体には当然それなりのリスクがあります。それと比べて、Authorization Codeの場合、Authorization Codeだけでは何の意味もなさないので、IDトークンの受け渡しよりセキュリティ的により安全と言えます。

最後

Authorization Code認証もIDトークン認証もどちらもよい部分があるので、フロントエンドとバックエンドを含めた全システムのアーキテクチャを考えて、最適なものを選べばよいでしょう。

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0