PKCE 詳細規格請參閱 RFC7636
我在撰寫 OAuth 2.0 的登入時,會遇到 code_verifier
和 code_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[:]))
}
沒有留言:
張貼留言