0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-04-01

IDトークンからユーザー情報を取得する方法

IDトークンはJWT(JSON Web Token)です。それをデコードする方法が2つあります。

1.HUAWEI Account Kit serverが提供しているAPI(デバッグ以外は非推奨)
2.JWTDecode.Androidでデコード

HUAWEI Account Kit serverが提供しているAPI

API:https://oauth-login.cloud.huawei.com/oauth2/v3/tokeninfo
メソッド:POST
パラメータ:

パラメータ名
id_token IDトークン
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です。

build.gradle
implementation 'com.auth0.android:jwtdecode:2.0.0'
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()
    }
}

シリーズ

GitHub

参考

0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?