2017-07-19 42 views
0

不確定這是否可能:我想從服務器流切換到本機客戶端流,以便爲我的用戶提供更好的身份驗證體驗。使用Azure AppService的原生Android/Google登錄

問題是Azure AppService需要一個「Web應用程序」OAUTH設置(包含客戶端ID和密碼),而本地登錄僅使用客戶端ID而非祕密。這意味着在電話上登錄後,我確實有Google令牌,但AppService不知道如何處理它並返回給我HTTP Unauthorized

手機客戶端SDK爲我提供了一個API,但這不適用於這種令牌。

var jObject = new JObject(
    new JProperty("access_token", auth.AccessToken), 
    new JProperty("id_token", auth.IdToken)); 

await ServiceClient.LoginAsync(MobileServiceAuthenticationProvider.Google, jObject); 

任何想法正確的方式來整合,而不必寫我自己的服務器端令牌驗證?

回答

0

由於您試圖訪問非Google API,因此您仍然需要在Google中配置Web應用程序。本身的登錄是不夠的。

這意味着您仍然需要爲後端提供ID和密碼。客戶端負責獲取發送給服務器的id令牌和授權碼,並且服務器根據Google documentation實際檢索訪問令牌。

因此,這意味着您的通話將實際上看起來像下面這樣:

var jObject = new JObject(
    new JProperty("authorization_code", auth.ServerAuthCode), // not sure what property your auth binding exposes this as 
    new JProperty("id_token", auth.IdToken)); 

await ServiceClient.LoginAsync(MobileServiceAuthenticationProvider.Google, jObject); 

沒有使用Xamarin.Android端至端的文檔,但你可能會發現它很有用瀏覽一下App Service iOS documentation for this scenario只是爲了看運動部件。您將遵循的一般模式是:

  • 配置一切爲了服務器流量(因爲你已經做過)
  • 設置的谷歌登錄的SDK(好像你已經做了已經,也)。
  • 使通話以上

所描述的,你可能會遇到的主要問題是確保您有API控制檯登錄正確的。您需要確保您的Android客戶端連接到您正在使用的Web應用程序客戶端ID。我建議快速查看Google Sign-in for Android setup instructions。另外請注意,授權碼是一次性使用,並且Google會在一定時間內爲用戶提出太多要求的限制。你可能會在開發期間遇到這種情況。

0

據我所知,本地客戶端流程也使用谷歌代碼流獲取訪問令牌。

根據此article,Android,iOS或Chrome應用程序不需要獲取訪問令牌的祕密。

從API控制檯獲取的客戶端密鑰。註冊爲Android,iOS或Chrome應用程序的客戶端不需要此值。

但是,如果您未在後端設置啓用Azure應用服務認證/授權,則Web應用後端將不會授權此訪問令牌。因爲後端將擁有自己的邏輯(移動服務器庫根據訪問令牌編寫邏輯)根據訪問令牌返回認證令牌。

現在,在您的移動應用程序中啓用客戶端流程的最簡單方法是在您的後端設置,以啓用Azure應用服務谷歌身份驗證/授權與同一clientid和祕密(基於我的測試:如果你不設置正確的祕密,後端仍然會返回授權令牌)。

下面是測試圖像:

enter image description here

如果你還不想讓谷歌應用程序容易權威性,我建議你可以創建一個包含自己的邏輯來檢查accesstoekn定製認證並從谷歌獲取用戶信息。

如果檢查結果是成功並獲得足夠的值,則可以生成身份驗證令牌並返回到客戶端。

有關如何在移動應用程序後端創建自定義身份驗證的更多詳細信息,請參閱此article

+0

聖牛白蘭度,只是添加一個虛擬祕密ClientID工作!我在這裏有兩個問題:你是否發現了AppService中一個允許提交假令牌的嚴重安全漏洞,或者如果密鑰不匹配,Azure是否會驗證該令牌是否違背Google的公鑰基礎結構?請參閱https://developers.google.com/identity/sign-in/web/backend-auth#verify-the-integrity-of-the-id-token。 另外:我使用的密鑰僅限於Android應用。這意味着我的應用服務無法爲使用簡單認證的iOS客戶端服務,而不是? –

+0

在我看來,使用服務器流時,祕密用於獲取訪問令牌。如果您使用客戶端流量,您將首先獲取訪問令牌和idtoken,並將其發送到後端。後端將解碼idtoken(jwt token),它包含觀衆。如果觀衆與google appid相同,並且用戶信息與idtoken數據相同,則會將auth令牌返回給客戶端。 –

+0

如果您使用相同的appid在ios和android中獲取訪問令牌和標識令牌,則簡單驗證可以將正確的驗證令牌返回給客戶端。 –