我正在创建一个API(Restlet,GAE)并实现OpenId进行身份验证和OAuth2以保护对API的访问。从我构建的客户端Web应用程序测试时,一切都很好。当用户点击想要访问API的Web应用程序的一部分时,要求用户通过OpenId登录,然后要求用户授予对Web应用程序的访问权以从API获取资源。
但是,我注意到网络应用程序不知道用户是谁(!)。所有Web应用程序都有一个身份验证令牌。因此,Web应用程序不能说“Hello,username”,因为它不知道用户是谁。
使用Restlet技术,身份验证基本上是:
//验证码
OpenIdVerifier verifier = new OpenIdVerifier(OpenIdVerifier.PROVIDER_YAHOO);
verifier.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应用程序。流程看起来与用户完全相同,但Web应用程序能够捕获用户信息(电子邮件),一切都很好。似乎与“两个”代码没有任何冲突。
解决问题的另一种方法是向API添加一些内容,返回与authToken相关的用户信息(Twitter的verify_credentials)。
我的问题:我采取的方法是否合理?我应该使用Twitter方法吗?还是完全不同的东西? (我对所有这些东西都很陌生,所以很难弄清楚我是否选择了一个似乎有用的解决方案,只是为了以后打砖墙。)
答案 0 :(得分:0)
简短的回答是,当客户端Web应用程序获得代表用户访问OAuth资源的权限时,客户端Web应用程序不应该知道有关用户的任何信息(登录名,密码等)。如果客户端Web应用程序想知道用户是谁,则可以提供身份验证。
我已经使用Restlet和谷歌应用引擎实现了上述方案,允许用户通过OpenId向资源服务器进行身份验证,并为Web客户端应用添加Google身份验证(这样就可以发出“hello”消息)。一切似乎都很好。