2012-06-06 30 views
0

我正在創建一個API(Restlet,GAE)並實現了用於身份驗證的OpenId和OAuth2來保護對API的訪問。當從我構建的客戶端Web應用程序進行測試時,一切都很好。當用戶點擊需要訪問該API的Web應用程序的一部分時,系統會要求用戶通過OpenId登錄,然後被要求授予對該Web應用程序的訪問權限以從API中獲取資源。使用OAuth2時獲取用戶信息 - 是否合理?

但是,我注意到網絡應用程序不知道用戶是誰(!)。所有的網絡應用程序都是一個身份驗證令牌。因此,Web應用程序不能說「你好,用戶名」,因爲它不知道用戶是誰。

隨着技術的Restlet,認證基本上是: //驗證碼 OpenIdVerifier驗證=新OpenIdVerifier(OpenIdVerifier.PROVIDER_YAHOO); verifier.addRequiredAttribute(AttributeExchange.EMAIL);
Authenticator au = new MyRedirectAuthenticator(getContext(),verifier,null);

雖然下面的把手認證和授權的OAuth2: //認證+ OAuth的代碼: OAuthParameters PARAMS =新OAuthParameters( 「2345678901」, 「secret2」,「HTTP://本地主機:8888/V3/「,角色); OAuthProxy local = new OAuthProxy(params,getContext());

最初我只在我的web應用程序中使用「Authentication + OAuth」,身份驗證發生在「隱身」(如上所述)。

我覺得解決「問題」的一個辦法是,如果web應用程序處理「可見」的身份驗證。所以我將驗證碼添加到了網絡應用程序中。流程看起來與用戶完全相同,但Web應用程序能夠捕獲用戶信息(電子郵件),一切正常。與「兩個」代碼似乎也沒有任何衝突。

解決此問題的另一種方法是向API添加一些內容,以返回與authToken(Twitter的verify_credentials)關聯的用戶信息。

我的問題:我採取的方法合理嗎?我應該使用Twitter方法嗎?或者完全不同的東西? (我對所有這些東西都很陌生,所以很難弄清楚我是否選擇了一種似乎能夠工作的解決方案,而後來纔打出了一堵磚牆)。

回答

0

簡而言之,當客戶端Web應用程序獲得代表用戶訪問OAuth資源的權限時,客戶端Web應用程序不應該知道有關用戶(登錄名,密碼等)的任何信息。如果客戶端Web應用程序想知道用戶是誰,它可以提供身份驗證。

我已經通過Restlet和谷歌應用程序引擎實現了上述方案,允許用戶通過OpenId向資源服務器進行身份驗證,併爲Web客戶端應用程序添加Google身份驗證(只需提供「hello」消息) 。一切似乎都很好。