如何使用当前的Google App Engine经过身份验证的用户从GAE发出http请求

时间:2013-02-07 22:16:43

标签: java google-app-engine login oauth-2.0

我在一家大公司工作,该公司在Google注册了域名。所有用户身份验证均通过Google登录页面完成

我在GAE中运行了项目,该项目在注册域( ie:https://appengine.google.com/a/MYDOMAIN.COM )内不是(尚),并且仍在appspot上运行({ {3}})

为了能够访问我的应用,用户必须登录我们的域。 这是按照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请求。

所以,要明确的是,我的问题是:

如何使用已经过身份验证的用户来呼叫外部服务?


PARTIAL ANSWER

我想我差不多了!

这是我正在做的事情:

用户通过jsp页面访问我的应用程序,该页面的行为基本上类似于servlet(即HTTPRequest& HTTPResponse可用)。

当与未经过身份验证的用户进行访问时,由于userService.createLoginURL(HttpRequest.getRequestURI());

,他/她将被重定向到google登录页面

感谢Google管理身份验证的方式,一旦用户登录,他/她就会自动重定向到我的jsp页面。

当服务器从“jsp”收到请求时,我会检查经过身份验证的用户是否属于我的公司(请记住“com.google.appengine.api.users.UserService.user_organization”属性..)。 如果是,我从HTTPResquest(HttpRequest.getCookies())检索所有cookie,查找名为“ ACSID ”的cookie并存储它。

从那里我可以使用此cookie在任何需要进行身份验证的网络应用程序上进行调用。

但这是事情出错的地方。

  • 当我在本地(在我的电脑上)模拟GET调用时,将检索到的cookie调用到mygreatapp.appspot.com(例如使用NetTool),一切顺利。

  • 当我在 Eclipse 中本地运行我的应用程序时(由于无法实际登录而对cookie进行硬编码),并且调用mygreatapp.appspot.com,一切都顺利进行

  • 但是当我将应用程序上传到Google并尝试时,它无法通过身份验证(实际上,我得到了302 OK作为答案,以及登录页面的位置标题!)。由于调试起来相当困难,我有点卡住了。

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

非常感谢!

最后,我必须承认,我正在努力实现的目标没有任何解决方案。从某种意义上说,这实际上是一个好消息,因为它证明了谷歌的安全性并不容易打破! 问题已经结束。

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

答案 2 :(得分:0)

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

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

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

我不太明白你打算如何让app A获取用户的会话cookie,因为Cookie只是为了暴露给原始域而设计。

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