能否在沒有重定向伺服器的情況下使用OAuth 2.0?
P粉710478990
2023-08-22 22:18:09
<p>我正在嘗試建立一個基於Java的本機客戶端,與SurveyMonkey API進行互動。 </p>
<p>SurveyMonkey要求使用OAuth 2.0產生長期有效的存取令牌,這是我不太熟悉的。 </p>
<p>我已經在Google上搜尋了幾個小時,我認為答案是否定的,但我只是想確保一下:</p>
<p>我是否可以寫一個簡單的Java客戶端與SurveyMonkey進行交互,<strong>而無需在某個雲端設定自己的重定向伺服器</strong>? </p>
<p>我覺得擁有自己的線上服務是必要的,才能夠接收由OAuth 2.0產生的令牌。難道我不能讓SurveyMonkey直接將令牌傳送給我的客戶端嗎? </p>
<p>如果我在某個地方設定了自己的自訂Servlet,並將其用作redirect_uri,那麼正確的流程應該如下:</p>
<ol>
<li>Java客戶端向SurveyMonkey請求令牌,其中redirect_uri是我的自訂Servlet的URL。 </li>
<li>SurveyMonkey將令牌發送到我的自訂Servlet的URL。 </li>
<li>Java客戶端輪詢自訂Servlet的URL,直到取得令牌。 </li>
</ol>
<p>這樣正確嗎? </p>
是的,可以在沒有回呼URL的情況下使用OAuth2。 RFC6749介紹了幾個流程。隱式流程(現已棄用[1])和授權碼流程(Authorization Code)需要重定向URI。然而,資源擁有者密碼憑證流程(也已棄用[1])不需要。
自RFC6749發布以來,也發布了其他規範,這些規範不需要任何重定向URI:
此外,使用OpenID Connect時,回應模式不一定是重定向到
redirect_uri
參數,而可以是對該端點的POST請求。有關詳細信息,請參閱OAuth 2.0表單POST回應模式規格。無論如何,如果上述授權類型不適合您的需求,您可以建立一個自訂授權類型。
[1]:OAuth 2.1規範(草案07)
並不完全準確,OAuth流程的整個重點在於使用者(你代表其存取資料的客戶端)需要給予你存取他們資料的權限。
請參閱身份驗證說明。你需要將使用者傳送到OAuth授權頁面:
這將向使用者顯示一個頁面,告訴他們你正在要求存取他們帳戶的哪些部分(例如查看他們的調查、查看他們的回答等)。一旦使用者透過在該頁面上點擊「授權」來批准,SurveyMonkey將自動跳到你設定為重定向URI的頁面(確保上述URL中的重定向URI與你應用程式設定中設定的相符)並返回授權碼。
因此,如果你的重定向URL是
https://example.com/surveymonkey/oauth
,SurveyMonkey將使用授權碼將使用者重定向到該URL:
#https://example.com/surveymonkey/oauth?code=<auth_code>
然後,你需要使用該授權碼透過向
https://api.surveymonkey.net/oauth/token?api_key=<your_api_key>
發送POST請求來交換存取權杖,並提供以下POST參數:這將傳回一個存取令牌,然後你可以使用該存取令牌來存取使用者帳戶上的資料。你不需要將存取權杖提供給用戶,它是供你使用以存取用戶帳戶的。無需輪詢或其他操作。
如果你只是存取自己的帳戶,可以使用應用程式設定頁面提供的存取權杖。否則,除非設定自己的重定向伺服器,否則無法為使用者取得存取權杖(除非所有使用者都屬於同一組,即同一帳戶下的多個使用者;但我不會深入討論這個)。 SurveyMonkey需要一個地方來發送授權碼給你,你不能只是請求一個。