2024年7月19日 星期五

OAuth 2.0 的 PKCE 筆記

PKCE 詳細規格請參閱 RFC7636

我在撰寫 OAuth 2.0 的登入時,會遇到 code_verifiercode_challenge 一直對不起來的狀況。

舉例來說,我請求 token 的參數為

client_id=aaa&
client_secret=bbb&
code=thisisasimpletoken&
code_verifier=HelloWorld&
grant_type=authorization_code

按照規範,我取得 authorization code 的 request 應該是 

client_id=aaa&
response_type=code&
scope=User.Read.All&
response_mode=form_post&
code_challenge_method=S256&
code_challenge=<將“HelloWorld”以 S256 加密後的字串>

如果只是將“HelloWorld”以 S256 加密得出來的字串填入 code_challenge 參數,會回報錯誤。

後來我查了很久,其實 code_challenge 的值不是只是將“HelloWorld”以 S256 加密,還要將其以 base64 進行 encode

即,在這範例中,code_challenge 應該是 hy5OUM6ZkNiwQTMMR8nd0Rvsa1A66ThqmdqFhOm7EsQ

以下是取得如何取得加密後的值的 golang code

package main

import (
	"crypto/sha256"
	"encoding/base64"
	"fmt"
)

func main() {
	sum := sha256.Sum256([]byte("HelloWorld"))
	fmt.Print(base64.RawStdEncoding.EncodeToString(sum[:]))
}

沒有留言:

張貼留言