Android端末におけるHUAWEI IDログイン機能の詳細実装手順８－GMS端末でログイン２

# IDトークンからユーザー情報を取得する方法
IDトークンはJWT（JSON Web Token）です。それをデコードする方法が２つあります。

１．HUAWEI Account Kit serverが提供しているAPI<b>（デバッグ以外は非推奨）</b>
２．JWTDecode.Androidでデコード

### HUAWEI Account Kit serverが提供しているAPI
API：https://oauth-login.cloud.huawei.com/oauth2/v3/tokeninfo
メソッド：POST
パラメータ：

|パラメータ名|値|
|:---:|:---|
|id_token|IDトークン|

```kotlin:NonHmsHuaweiIdLogic.kt
private fun decodeIdToken(
    context: Context,
    idToken: String
) {
    val queue = Volley.newRequestQueue(context)

    val postRequest: StringRequest = object : StringRequest(
        Method.POST,
        "https://oauth-login.cloud.huawei.com/oauth2/v3/tokeninfo",
        object : Response.Listener<String>{
            override fun onResponse(response: String?) {
                response?.let {response ->
                    val jsonObject = JSONObject(response)
                    // ユーザーID = jsonObject.optString("sub")
                    // プロフィール画像 = jsonObject.optString("picture")
                    // ユーザー名 = jsonObject.optString("display_name")
                }
            }
        },
        Response.ErrorListener { error -> error?.printStackTrace() }
    ) {
        override fun getBodyContentType(): String {
            return "application/x-www-form-urlencoded"
        }

        override fun getParams(): Map<String, String> {
            val params: MutableMap<String, String> = HashMap()
            params["id_token"] = idToken
            return params
        }
    }

    queue.add(postRequest)
}
```

レスポンスから、以下の情報が取得できます。

|パラメータ名|JSONフィールド|
|:---:|:---|
|ユーザーID|sub|
|プロフィール画像|picture|
|ユーザー名|display_name|


### JWTDecode.Androidでデコード
JWTDecode.Androidを使う場合、デコード作業は非常に楽です。
JWT(IDトークン)オブジェクトを作ってから、その中の値を参照するだけでよいです。

|パラメータ名|JWTの参照先|
|:---:|:---|
|ユーザーID|JWT.subject|
|プロフィール画像|JWT.claims["picture"]?.asString()|
|ユーザー名|JWT.claims["display_name"]?.asString()|

また、セキュリティを高めるため、issuerとaudienceを確認することをお勧めします。
issuerは[https://accounts.huawei.com]()であり、
audienceはアプリIDです。

```gradle:build.gradle
implementation 'com.auth0.android:jwtdecode:2.0.0'
```

```kotlin:NonHmsHuaweiIdLogic.kt
private fun decodeIdToken(context: Context, idToken: String, useApi: Boolean) {
    val jwt = JWT(idToken)
    if (!jwt.issuer.equals("https://accounts.huawei.com")) {
        throw Exception("Id token issuer is not correct")
    } else if (jwt.audience?.contains(AGCUtils.getAppId(context)) != true) {
        throw Exception("Id token audience is not correct")
    } else {
        // ユーザーID = jwt.subject
        // プロフィール画像 = jwt.claims["picture"]?.asString()
        // ユーザー名 = jwt.claims["display_name"]?.asString()
    }
}
```

# シリーズ
- [Android端末におけるHUAWEI IDログイン機能の詳細実装手順１－ソリューションの概要](https://qiita.com/Rei_2020/items/e02814bd688a41ab8702)
- [Android端末におけるHUAWEI IDログイン機能の詳細実装手順２－実装準備](https://qiita.com/Rei_2020/items/2eb9dada38cdfc2729ef)
- [Android端末におけるHUAWEI IDログイン機能の詳細実装手順３－HMS判定](https://qiita.com/Rei_2020/items/285107103be525ce3f98)
- [Android端末におけるHUAWEI IDログイン機能の詳細実装手順４－HMS端末でログイン](https://qiita.com/Rei_2020/items/548781581caf3e2f4046)
- [Android端末におけるHUAWEI IDログイン機能の詳細実装手順５－HMS端末でログアウト](https://qiita.com/Rei_2020/items/cc214859b82f518a1cd7)
- [Android端末におけるHUAWEI IDログイン機能の詳細実装手順６－HMS端末で権限取り消し](https://qiita.com/Rei_2020/items/a04a5894d5e565db969d)
- [Android端末におけるHUAWEI IDログイン機能の詳細実装手順７－GMS端末でログイン１](https://qiita.com/Rei_2020/items/0a7172d22817a5ae110f)
- [Android端末におけるHUAWEI IDログイン機能の詳細実装手順８－GMS端末でログイン２](https://qiita.com/Rei_2020/items/c083a16ef016eecdd5ad)
- [Android端末におけるHUAWEI IDログイン機能の詳細実装手順９－GMS端末でログアウト](https://qiita.com/Rei_2020/items/c0c1f1a68bfd0216cdd3)
- [Android端末におけるHUAWEI IDログイン機能の詳細実装手順１０－GMS端末で権限取り消し](https://qiita.com/Rei_2020/items/2afd389ae123e0552cae)

# GitHub
* https://github.com/Rei2020GitHub/MyPublicProject/tree/master/AccountDemo(H%2BG)

# 参考
* HMS：https://developer.huawei.com/consumer/jp/
* HMS Account Kitの紹介：https://developer.huawei.com/consumer/jp/doc/overview/HMS
* HMS Account Kitのドキュメント：https://developer.huawei.com/consumer/jp/doc/development/HMSCore-Guides-V5/introduction-0000001050048870-V5
* Huawei Developers：https://forums.developer.huawei.com/forumPortal/en/home
* Facebook Huawei Developersグループ：https://www.facebook.com/Huaweidevs/