Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用当前的Google App Engine认证用户从GAE发出http请求_Java_Google App Engine_Login_Oauth 2.0 - Fatal编程技术网

Java 如何使用当前的Google App Engine认证用户从GAE发出http请求

Java 如何使用当前的Google App Engine认证用户从GAE发出http请求,java,google-app-engine,login,oauth-2.0,Java,Google App Engine,Login,Oauth 2.0,我在一家大公司工作,它有一个在谷歌注册的域名。所有用户的身份验证都是通过谷歌登录页面完成的 我有一个在GAE中运行的项目,它(还)不在注册域(即:)中,并且仍然在appspot()上运行 要访问我的应用程序,用户必须登录到我们的域。 这是按照GAE教程中的建议实现的:(非常简化的版本,不是真正的代码) 一旦获得经过身份验证的用户,我们还将检查com.google.appengine.api.users.UserService.user\u organization属性,以确保经过身份验证的用户来

我在一家大公司工作,它有一个在谷歌注册的域名。所有用户的身份验证都是通过谷歌登录页面完成的

我有一个在GAE中运行的项目,它(还)不在注册域(即:)中,并且仍然在appspot()上运行

要访问我的应用程序,用户必须登录到我们的域。 这是按照GAE教程中的建议实现的:(非常简化的版本,不是真正的代码)

一旦获得经过身份验证的用户,我们还将检查
com.google.appengine.api.users.UserService.user\u organization
属性,以确保经过身份验证的用户来自我们的域

一旦正确验证,用户可以在某个时候要求应用程序(GAE)向属于另一个应用程序的服务发出http请求,该应用程序在我们的域中,并且要求经过验证的用户(当然是从我们的域)访问。 因为我已经有了一个完全有效的用户,所以我想使用*it*来执行Http请求

因此,我的问题是:

如何使用已通过身份验证的用户调用外部服务?


部分答案

我想我差点就成功了

以下是我正在做的:

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

当使用未经身份验证的用户进行访问时,他/她将被重定向到google登录页面,这要感谢
userService.createLoginURL(HttpRequest.getRequestURI())

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

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

从那里,我应该能够使用这个cookie在任何需要对用户进行身份验证的web应用程序上进行调用

但这就是问题所在

  • 当我在本地(在我的电脑上)模拟一个GET调用,并使用检索到的cookie调用mygreatapp.appspot.com(例如使用NetTool),一切都会顺利进行

  • 当我在Eclipse中本地运行我的应用程序(使用cookie硬编码,因为您实际上无法登录),并调用mygreatapp.appspot.com时,一切都会顺利进行

  • 但当我将应用程序上传到谷歌并尝试时,它无法通过身份验证(事实上,我得到的答案是302OK,登录页面有一个位置标题!)。由于调试比较困难,我有点卡住了

有人知道什么会失败吗

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

应用程序引擎文档的这一部分是否相关


您应该查看。

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

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

我猜,您没有在应用程序引擎上使用此功能的原因是会话cookie绑定到特定的ip地址/范围/用户代理

我不太明白你打算如何让应用程序A获得用户的会话cookie,因为cookie被设计为只向原始域公开


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

谢谢Jonathan,但恐怕不行。我认为当您想从GAE访问您的内部网时,SDC是有用的。在我的情况下,我只想访问另一个应用程序,也位于谷歌,但在我的公司域内。不管怎么说,我也已经试过了;-)嗨,阿恩,非常感谢你抽出时间回答。你对我的问题的描述完全正确。我同意这听起来有点“不可靠”,而且这不是建造它的最佳方式。其背后的原因是,在公司域内获得GAE应用程序的内部批准可能需要很长时间,我需要我的用户能够尽快使用该应用程序。我将再次查看OAuth,看看如何使用它。我也同意这不应该真的起作用。。如果是这样的话,这可能是谷歌安全方面的一个巨大差距,不是吗?是的,你的方法因为cookie问题而不起作用。我看了OAuth,还玩了一下OAuth游乐场。事实上,我真的不知道这对我有什么帮助。就我所见,我可以为我的应用程序获取访问令牌,我也可以使用它访问谷歌API(日历、邮件等),但如果我尝试使用此令牌访问“应用程序B”,我会被重定向到登录页面。可能是因为OAuth并没有在他们这边实现。。我将对其进行更深入的研究,也可能对OpenID进行研究……这是正确的——Oauth也需要在另一端实现。我想不出有什么方法可以在不改变AppB的情况下实现你想要实现的目标。最后一个机会是改变策略并从javascript调用AppB Web服务。但这将是一个跨域请求。我真的不知道如何在不改变应用程序B的情况下管理它。
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 */
    {
}