玩玩看 Spotify 的 Authorization Code Flow with PKCE
- Web
- 20 Sep, 2020
看到 Spotify 有支援另外一種 Authorization Code Flow,叫做 Authorization Code Flow with Proof Key for Code Exchange (PKCE),來玩玩看
Authorization Code Flow with PKCE 跟 Authorization Code Flow 的差異在於。為了怕使用者的 code 被中間人竊取而拿去取得 access token 來盜用,多了一點驗證機制,讓取得 access token 時需要跟 Spotify 證明:我是剛剛那個跟你要 code 的使用者。
因此在「取得 code 階段」,多傳了code_challenge_method 與 code_challenge。並在「取得 access token」階段,多傳了code_verifier 。
code_verifier 是一組隨機產生的亂碼,code_challenge 是由 code_verifier 經過 SHA256 產生的 digest,並用 Base 64 encode 的字串。
在 Spotify 收到請求 access token 的需求時,會用 code_verifier 來驗證這組的 code 原始請求所附帶的 code_challenge 是不是能由這組 code_verifier 來產生,如果可以的話,就代表這的請求是來自正確的使用者。原因是只靠code_challenge 是無法反推回 code_verifier 的,所以能拿出 code_verifier 就表示你是產生 code_challenge 的使用者。
產生 code_verifier 跟 code_challenge 的 Ruby 腳本可以參考:
require 'securerandom'
require 'digest'
require 'base64'
code_verifier = SecureRandom.urlsafe_base64(96)
puts "code_verifier: #{code_verifier}"
code_challenge = Base64.urlsafe_encode64(Digest::SHA256.digest(code_verifier), padding: false)
puts "code_challenge: #{code_challenge}"