那個不等你的 API:一個大剌剌擺在眼前的競態條件

一套自動化流程的兩步驟驗證登入,一直失敗並顯示「輸入是空的」,即使正確的驗證碼是在觸發後一秒內送出的——因為「一秒後」早就太遲了,而真正的修法在於兩個 API 呼叫的順序,不是它們的內容。

This article is also available in English: English version——內容相同,僅語言不同。

對一套自動化登入流程的 HTTP API,在觸發登入之後立刻送出正確的兩步驟驗證碼, 卻一致地失敗,顯示一個籠統的「輸入是空的」錯誤——即使驗證碼是對的、送得很快, 而且完全一樣的流程,稍後手動重試時有時候又會成功。 真正的 bug 是一個大剌剌擺在眼前的競態條件:一個「這個 API 會等輸入」的假設, 而它其實從來就不會等。

看起來理所當然的做法,以及為什麼會失敗

一套自架的帳號自動化工具,開放了一個 HTTP API,有兩個相關的呼叫: 一個用來針對某個帳號觸發登入嘗試,另一個用來在工具詢問時, 送出一個待處理的輸入值(兩步驟驗證碼、電子郵件驗證碼, 或是一個裝置核准請求的是/否回應)。看起來理所當然正確的順序是: 觸發登入、等它詢問輸入、然後送出它問的那個輸入。 這個順序幾乎每次都會失敗,log 訊息大致是「輸入是空的」—— 彷彿根本沒有送出任何東西,儘管明明在觸發嘗試之後沒多久, 就確實 POST 了一個值過去。

Unlock this article to keep reading, or subscribe for unlimited access to everything. See Pricing for details.