2012-12-17 23 views
0

我有以下情況:提供在Metro應用谷歌登錄,避免重複許可的授予(的oauth2 /谷歌的OpenID)

目前,我正在嘗試寫一個Metro風格的應用程序,以讓能力用戶使用他的Google帳戶登錄,並且該應用程序請求多個權限,如Userinfo.profile和Userinfo.email。

爲此,我正在使用OAuthv2,並要求詳細的工作很好(經過相當多的努力和研究)。

URL中使用:

const string url = "https://accounts.google.com/o/oauth2/auth?" + 
        "client_id=" + clientId + 
        "&redirect_uri=" + "urn:ietf:wg:oauth:2.0:oob" + 
        "&response_type=code" + 
        "&scope=https://www.googleapis.com/auth/userinfo.profile+https://www.googleapis.com/auth/userinfo.email" + 
        "&access_type=offline"; 

現在的問題是,如果我想將用戶留驗證,我想要麼通過保存令牌在客戶方這樣做,由用戶,或找到某種方式使用Google登錄,保持會話並檢查他是否通過身份驗證。

問題是,我不知道如何執行後者,也不知道如何使用它。 目前,每次打開應用程序時,用戶都會被重定向到google授權頁面,整個過程在每次重新啓動時都會重新開始。

我想要完成的是,如果用戶登錄,我有一些方法可以識別他,而不是總是通過重新請求給定詳細信息的權限來爲他添加負擔。

我看着OpenID,但我總是

<?xml version="1.0" encoding="UTF-8"?> 
<xrds:XRDS xmlns:xrds="xri://$xrds" xmlns="xri://$xrd*($v*2.0)"> 
<XRD> 
<Service priority="0"> 
<Type>http://specs.openid.net/auth/2.0/server</Type> 
<Type>http://openid.net/srv/ax/1.0</Type> 
<Type>http://specs.openid.net/extensions/ui/1.0/mode/popup</Type> 
<Type>http://specs.openid.net/extensions/ui/1.0/icon</Type> 
<Type>http://specs.openid.net/extensions/pape/1.0</Type> 
<URI>https://www.google.com/accounts/o8/ud</URI> 
</Service> 
</XRD> 
</xrds:XRDS> 

作爲此網址的響應:

https://www.google.com/accounts/o8/id?openid.mode=checkid_setup&openid.ns=http://specs.openid.net/auth/2.0&openid.return_to=urn:ietf:wg:oauth:2.0:oob&openid.ns.ui=http://specs.openid.net/extensions/ui/1.0&openid.ns.ax=http://openid.net/srv/ax/1.0&openid.ax.mode=fetch_request&openid.ax.required=email,firstname,language,lastname,country&openid.ns.ext=http://specs.openid.net/extensions/oauth/1.0&openid.ext2.consumer=https://www.google.com/accounts/o8/ud?openid.mode=checkid_setup&openid.ns=http://specs.openid.net/auth/2.0&openid.return_to=urn:ietf:wg:oauth:2.0:oob&openid.ext2.scope=https://www.googleapis.com/auth/userinfo.profile+https://www.googleapis.com/auth/userinfo.email 

難道我構建它錯了嗎?

如果有任何建議,無論是對如何執行這個「正確」,就是我試圖完成(與谷歌的整合,允許用戶登錄使用谷歌電子郵件和只有如果他不是招't授權該應用程序,請求他這樣做,再加上尋找一種方式,讓他登錄第二次以後的時間),或者如何才能做到這一點,請放心。

此外,通過使用.Net 4.5框架的精簡版本,似乎我無法使用OpenID庫,因爲它們依賴於完整的4.5。

* 編輯 *望着MSDN此出現:

To support SSO, the online provider must allow you to register a redirect URI in the form ms-app://appSID, where appSID is the SID for your app. 

這是否意味着它僅僅是不可能的?因爲在谷歌我只能請求與http(s)://域的密鑰?

回答

1

你看過嗎? https://developers.google.com/accounts/docs/OAuth2Login

看起來您正在使用Web服務器流程並請求脫機訪問。交換代碼後,這應該會爲您提供刷新令牌。在你的應用程序中保留這個令牌。如果您也進行登錄授權,您將獲得一個令牌,您可以使用它獲取Google用戶的用戶ID

如果您的某個特定的刷新令牌有效,應用程序應該跟蹤用戶。然後使用該標記獲取當前憑據。您可以使用tokeninfo enpoint來驗證令牌。如果您擁有該用戶的有效令牌,則無需通過代碼流發送它們以獲取另一個刷新令牌。

如果您使用tokeninfo端點,則只有在訪問令牌請求中存在https://www.googleapis.com/auth/userinfo.profile範圍時,纔會顯示userid字段。該字段的值是登錄用戶的不可變標識符。存儲這個,你應該有一個用戶的持久標識符。

+0

是的,我確實收到了一個授權令牌,將它換成訪問令牌等。這很好,但如果用戶退出應用程序,我應該重定向到哪些Google url以接收它們適當的標識符,所以我可以找出使用哪個標記?就像用戶登錄頁面一樣,我收到他的userId,所以我知道使用哪個令牌?所有[此授權](https://developers.google.com/accounts/docs/OAuth2InstalledApp)均正常運行。 – Daneo

+1

對於已安裝的應用程序,我們目前沒有辦法讓您將用戶發送給我們,也沒有提示他們。這對於js客戶端應用程序是可能的,但出於安全原因,我們爲安裝的應用程序阻止它。註銷應用程序的用戶應該非常少見,例如,如果他們想要切換應用程序。你可以讓他們永久登錄,並讓他們添加accts並切換。 –

+0

我明白了,作爲一個側面問題(也許更新你的答案和安全原因部分),clientSecret和Id的存儲位置在哪裏?因爲如果一個應用程序被拆卸,他們可能只是在看這個祕密,所以在這種情況下我應該怎麼做?或者沒有那麼重要? – Daneo