前書き
HMS Account Kit実装入門でIDトークンによるユーザー認証を紹介しました。本章はAuthorization Codeによるユーザー認証と、IDトークンによるユーザー認証との違いを紹介したいと思います。
前準備
AppGallery ConnectでAccount Kitの設定ページに入り、redirect_uriをセットします。サーバー側がユーザー情報をファーウェイのアカウントサーバーから取得する場合は設定しなければなりません(APIを呼び出すのに必須なパラメータであるため)。
実装
こちらはオフィシャルサイトに掲載されているシーケンス図です。
各ステップに対応しているコード実装は下記に示します。
ステップ1
ユーザーが”HUAWEI IDでログイン”ボタンを押すというプロセスです。ボタンのデザインは細かく定められているので、オフィシャルページをご参照ください。
HUAWEI ID Sign-In Icon Specifications
ステップ2~4
”HUAWEI IDでログイン”ボタンが押されたときの処理です。
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とユーザーのアカウント情報はここで返ってきます。
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
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トークン認証もどちらもよい部分があるので、フロントエンドとバックエンドを含めた全システムのアーキテクチャを考えて、最適なものを選べばよいでしょう。