我在一家大公司工作,该公司在谷歌注册了一个域名。所有用户身份验证均通过 Google 登录页面完成
我有在 GAE 中运行的项目,该项目(尚未)在注册域内(即:https ://appengine.google.com/a/MYDOMAIN.COM )并且仍然在 apppot(http://mygreatapp.appspot)上运行。 com )
为了能够访问我的应用程序,用户必须登录我们的域。这是按照 GAE 教程中的建议实现的:(非常简化的版本,实际上不是真正的代码)
UserService userService = UserServiceFactory.getUserService();
currentUser=userService.getCurrentUser();
if (currentUser==null){ //not yet logged-in, so we redirect to the Google login page
String url=userService.createLoginURL(thisURL);
HttpResponse.sendRedirect(url);
}else{
String myOrg=ApiProxy.getCurrentEnvironment().getAttributes().get("com.google.appengine.api.users.UserService.user_organization");
if (myOrg!="myOrganization"){
/* We show an 'unauthorised access page',
with a link to the Google logout page */
{
}
一旦我们获得了经过身份验证的用户,我们还会检查该com.google.appengine.api.users.UserService.user_organization
属性以确保经过身份验证的用户来自我们的域。
一旦正确通过身份验证,用户可以在某个时候要求应用程序 (GAE) 必须向属于另一个应用程序的服务发出http 请求,该应用程序位于我们的域中,并且需要由经过身份验证的用户访问(来自我们的域, 当然)。由于我已经有一个完全有效的用户,我想使用 *it* 来执行 Http 请求。
所以,要清楚,我的问题是:
如何使用已经通过身份验证的用户调用外部服务?
部分答案
我想我几乎明白了!
这是我正在做的事情:
用户通过 jsp 页面访问我的应用程序,该页面的行为基本上类似于 servlet(即 HTTPRequest 和 HTTPResponse 可用)。
当未经身份验证的用户完成访问时,他/她将被重定向到谷歌登录页面,这要归功于 userService.createLoginURL(HttpRequest.getRequestURI());
感谢 Google 管理身份验证的方式,一旦用户登录,他/她就会自动重定向到我的 jsp 页面。
当服务器收到“来自”jsp 的请求时,我会检查经过身份验证的用户是否属于我的公司(记住“ com.google.appengine.api.users.UserService.user_organization
”属性..)。如果是真的,我从 HTTPResquest ( HttpRequest.getCookies()
) 中检索所有的 cookie,查找名为“ ACSID ”的那个并存储它。
从那里我应该能够使用此 cookie 在需要对用户进行身份验证的任何 Web 应用程序上进行调用。
但这就是事情出错的地方。
当我在本地(在我的电脑上)用检索到的 cookie 对 mygreatapp.appspot.com(例如使用 NetTool)进行 GET 调用时,一切都很顺利。
当我在Eclipse中本地运行我的应用程序(使用硬编码的 cookie,因为您实际上无法登录)并调用 mygreatapp.appspot.com 时,一切也都很顺利。
但是当我将应用程序上传到谷歌并尝试它时,它无法通过身份验证(实际上,我得到一个 302 OK 作为答案,以及一个登录页面的位置标题!)。由于很难调试,我有点卡住了。
任何人都知道什么可能会失败?
非常感谢!
最后,我不得不承认我想要实现的目标没有任何解决方案。从某种意义上说,这实际上是一个好消息,因为它证明了谷歌的安全并不是那么容易被破解的!问题已关闭。