0

我正在创建一个 API(Restlet、GAE)并实施 OpenId 进行身份验证和 OAuth2 以保护对 API 的访问。从我构建的客户端 Web 应用程序进行测试时,一切都很好。当用户点击想要访问 API 的 Web 应用程序的一部分时,会要求用户通过 OpenId 登录,然后要求授予对 Web 应用程序的访问权限以从 API 中获取资源。

但是,我注意到网络应用程序不知道用户是谁(!)。Web 应用程序只有一个身份验证令牌。因此,网络应用程序不能说“你好,用户名”,因为它不知道用户是谁。

使用 Restlet 技术,认证本质上是: // 认证码 OpenIdVerifier verifier = new OpenIdVerifier(OpenIdVerifier.PROVIDER_YAHOO); 验证器.addRequiredAttribute(AttributeExchange.EMAIL);
Authenticator au = new MyRedirectAuthenticator(getContext(), verifier, null);

虽然以下处理身份验证和 OAuth2 授权: // 身份验证 + OAuth 代码:OAuthParameters params = new OAuthParameters("2345678901", "secret2", "http://localhost:8888/v3/", roles); OAuthProxy local = new OAuthProxy(params, getContext());

最初,我只在我的网络应用程序中使用“身份验证 + OAuth”,并且身份验证是“不可见的”发生的(如上所述)。

我认为解决“问题”的一种方法是,如果网络应用程序“可见”地处理身份验证。所以我将身份验证代码添加到网络应用程序中。流程对用户来说看起来完全一样,但是 Web 应用程序能够捕获用户信息(电子邮件)并且一切都很好。与“两者”代码似乎也没有任何冲突。

解决此问题的另一种方法是向 API 添加一些内容,以返回与 authToken 关联的用户信息(类似于 Twitter 的 verify_credentials)。

我的问题:我采取的方法合理吗?我应该改用 Twitter 方法吗?还是完全不同的东西?(我对所有这些东西都很陌生,所以很难弄清楚我是否选择了一个似乎有效的解决方案,只是后来碰上了砖墙)。

4

1 回答 1

0

简短的回答是,当客户端 Web 应用程序获得代表用户访问 OAuth 资源的权限时,客户端 Web 应用程序不应该知道有关用户的任何信息(登录名、密码等)。如果客户端 Web 应用程序想知道用户是谁,它可以提供身份验证。

我已经使用 Restlet 和 google app 引擎实现了上述方案,允许用户通过 OpenId 对资源服务器进行身份验证,并为 Web 客户端应用程序添加 Google 身份验证(这样它就可以发出“hello”消息)。一切似乎都很好。

于 2012-07-06T02:30:18.020 回答