我正在努力理解登錄蘋果。我假設有一個應用程序服務器、一個ios應用程序和蘋果身份驗證提供商。在WWDC 2020 session“充分利用蘋果登錄”中,蘋果對授權請求中的nonce值有這樣的說法:
但正如我們之前提到的,該請求還具有一些屬性,可以幫助使授權過程更加安全。這些是nonce和state。
這些屬性將允許您驗證在執行請求后獲得的授權和憑據是否是您所期望的。讓我們先來談談這些屬性是什么。nonce是在請求中作為字符串發送的不透明數據塊。每次創建新請求時都要生成一個唯一的nonce,這一點很重要,因為稍后您將能夠驗證此值。
為了做到這一點,nonce值將被返回給您,嵌入到授權憑據的identityToken屬性中。
這將允許您在服務器中驗證此值,有助于防止重播攻擊。
我的理解是:應用程序客戶端為發送到蘋果服務器的授權請求創建一個可上調的nonce。如果一切順利,蘋果將返回一個包含相同nonce的身份令牌。客戶端可以檢查身份令牌是否包含與請求中包含的隨機數值相同的隨機數,然后繼續將JWT發送到應用程序服務器,應用程序服務器可以使用蘋果的公鑰和簽名來確保JWT確實由蘋果簽名,從而確保用戶是他們聲稱的用戶。
但蘋果公司說
這將允許您在服務器中驗證此值,有助于防止重播攻擊。
(Emphasis mine)
在我描述的流程中,我的應用程序服務器不知道nonce,因此無法驗證任何有關它的信息。這里的建議是客戶端在創建授權請求之前先從應用程序服務器請求nonce(和session id)嗎。然后將該nonce作為授權請求的一部分發送,然后將包含nonce和session id的JWT發送到應用程序服務器?這樣,應用程序服務器也可以驗證隨機數是否確實與session開始時分配的隨機數相同?
您可以向服務器請求狀態和隨機數,但我不會,因為這可能是攻擊向量。
最好在應用程序中生成狀態和nonce。然后將這些內容包含在身份驗證請求中。
一旦你的應用程序收到蘋果的響應,它就可以驗證狀態是否與預期的狀態匹配。
然后將身份令牌和預期的nonce值發送到服務器。服務器驗證JWT是否由Apple簽名并包含預期的nonce。