0

我在一家大公司工作,该公司在谷歌注册了一个域名。所有用户身份验证均通过 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 作为答案,以及一个登录页面的位置标题!)。由于很难调试,我有点卡住了。

任何人都知道什么可能会失败?

非常感谢!

最后,我不得不承认我想要实现的目标没有任何解决方案。从某种意义上说,这实际上是一个好消息,因为它证明了谷歌的安全并不是那么容易被破解的!问题已关闭。

4

3 回答 3

0

您应该查看Google Accounts 3rd party app authorization

于 2013-02-08T05:43:55.127 回答
0

也许 App Engine 文档的这一部分是相关的?

https://developers.google.com/appengine/docs/python/urlfetch/overview#Secure_Data_Connection

于 2013-02-07T22:19:53.783 回答
0

如果我对您的理解正确,您尝试使用在 Google Apps 域(“域”)下登录的用户的凭据让不在域下运行的 GAE 应用程序(“应用程序 A”)访问 GAE 应用程序( “app B”)在域下运行,并要求所有使用都在域下进行身份验证。

这是一个糟糕的设计,不应该工作。

我猜你没有让它在 App Engine 上工作的原因是会话 cookie 绑定到特定的 ip-address/range/user-agent

我不太明白您打算如何让应用程序 A 获取用户的会话 cookie,因为 cookie 旨在仅向原始域公开。

显而易见的方法是使用 oauth。

于 2013-02-17T20:50:01.927 回答