桌面端和移動端是在App中内嵌浏覽器輔助完成OAuth2.0整個流程
流程如圖所示

OAuth2.0 Web端
1)傳回authCode到指定Web redirectUri(此uri是應用開發者來配置)
2)換token需要傳clientId和clientSecret驗證client身份 (應用後端服務擷取)
注意到以上兩點,
1) 因為不是Web應用 redirectUri檢測無效
2) 因為沒有後端服務 clientSecret無安全可言
那麼我們可能遭受到的攻擊如下圖所示,可能會有惡意的應用攔截authCode給AuthorizationServer發消息擷取token,如此便未經客戶給該應用授權而是給另外的正式的應用授權便拿到了token,達到了攻擊的目的。
解決方案:
1.用戶端生成一個随機字元串:code verifier,并儲存好這個随機字元串
code_challenge = transform(code_verifier, [Plain|S256])
如果transform method是plain,那麼code challenge等同于code verifier
如果transform method是S256,那麼code challenge等于code verifier的Sha256哈希
2.在授權碼請求中帶上code challenge,以及生成code challenge的方法。這兩者和服務端頒發的授權碼被綁定了起來
3.擷取授權碼之後,用戶端在用授權碼換取Access Token的時候,帶上初始生成的code verifier。服務端按照綁定的transform method對code verifier進行計算,計算的結果與綁定的code challenge進行對比,如果一緻則頒發Access Token。
參考資料:
https://tools.ietf.org/html/rfc7636