2
1

More than 3 years have passed since last update.

AndroidでPKCEのcode_challengeをS256で生成する方法

Posted at

概要

OAuthのPKCEを実装したAPIなどを呼び出す際に必要になる code_challenge の生成方法のTips

具体的には

ここ4.2. Client Creates the Code Challenge に記載のある以下の code_challenge をAndroid標準機能を使って作る方法

S256
   code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))

やり方

以下の "codeChallenge" でString型のcode_verifiercode_challengeに変換可能。

import android.util.Base64
import java.security.MessageDigest

val String.codeChallenge: String
    get() {
        val digest = MessageDigest.getInstance("SHA-256")
        val bytes = digest.digest(toByteArray())
        // **重要** encodeToStringの第2引数のフラグをちゃんと指定する
        return Base64.encodeToString(bytes, Base64.URL_SAFE or Base64.NO_WRAP or Base64.NO_PADDING)
    }

ロジックが正しいことの検証方法

ここcode_challenge_methodS256のケースにおける
正しいcode_verifiercode_challengeの組み合わせが記載されている。

code_verifierdBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXkの場合 code_challengeE9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cMが正解とのこと。

はまりどころ

Base64.encodeToStringのパラメータをちゃんと指定することが重要。

引数指定がない場合、
dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw+cM=\n
になる。

このため、以下の3つのパラメータが必要。

  • URL_SAFE
    +, -, /を適切に変換してURLセーフにする

  • NO_WRAP
    最後の改行コードを消す

  • NO_PADDING
    改行コードの前の=を消す

この記事書いた理由

このAPIをAndroidで呼ぶ際にハマって時間無駄にしたため。

2
1
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
2
1