2017-06-12 158 views
6

這是我的計劃(授權代碼流程)實現這種登錄/註冊邏輯。 (第三方僅提供了OAuth2 API如何使用OAuth2實現第三方登錄/註冊?

首先SPA前端將發送GET請求第三方

GET https://www.example.com/oauth2 
client_id=dummyclient 
redirect_uri=https://mysite/callback 
response_type=code 
scope=openid 

然後,如果用戶同意給他/她的OpenID mysite然後fronend會得到一個301 HTTP響應。

---> 301 https://mysite/callback?code=dummycode 

然後,瀏覽器將網頁重定向到mysite/callback,它會重新加載SPA以及其中可以通過SPA被捕獲,然後將代碼發送到真正的後端回調URL暴露的代碼。

GET https://mysite/api/real-callback?code=dummycode 

當後臺獲取代碼,將代碼發送給第三方,以便交換access_token。當後端獲得access_token時,它將觸發API請求以獲取用戶的openid,然後決定是讓用戶登錄還是註冊爲新用戶。最後,它會向我們的SPA前端返回一個HTTP響應,其中包含access_token,我的 OAuth2系統或401未經授權的響應。

所以我的問題是,如何證明真正的回調由自己的客戶調用(因爲如果一些攻擊者得到我的前端嵌入client_id那麼他就可以僞造的OAuth2請求和網絡釣魚的用戶同意。此後,攻擊者將得到一個有效的代碼,然後他將代碼發送回我真正的回調。最後,他將在我的系統中獲得用戶的access_token。)如何在沒有最終用戶提供密碼等附加信息的情況下使用OAuth2進行身份驗證。

+0

你沒有將真實回調URL作爲來自OAuth2服務器的重定向URL的原因是什麼?我沒有看到任何將驗證碼發送到SPA前端的理由。 –

+0

@JánHalaša即使沒有這個步驟,只要我在第三方的OAuth2回調請求後發回系統的'access_token'到前端,安全問題依然存在。我設計真正的回調的原因是我想實現前端和後端之間的真正分離。 – bitweaver

+0

你在SPA中需要什麼'access_token'? –

回答

1

我建議您將OAuth2流程更改爲Implicit並要求access_tokenid_token(OpenID Connect)。您的SPA將獲得令牌,將ID令牌發送到您的後端,後端可用它來決定是否可以創建此類用戶。 SPA可以使用訪問令牌來調用受保護的資源。

這樣,

  • 只有SPA將是一個OAuth2用戶端 - 令牌不能由兩個應用程序(SPA和後端)一起使用,
  • 你將有隻有一個重定向URI,
  • 您不需要將後端的令牌傳輸到SPA。

更新:如果沒有ID連接

如果您不能使用id_token,你可以發送access_token到你的後端和後端可以通過發送至令牌反省端點https://tools.ietf.org/html/rfc7662獲取用戶的用戶名(來自響應username屬性)。 username屬性是可選的。您的OAuth2服務器可能會返回更多信息(例如姓名和電子郵件)。

該自檢端點需要身份驗證,因此要使用它,您的後端必須是具有自己的client_id和祕密的註冊OAuth2客戶端。