我在一家大公司工作,该公司在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管理身份验证的方式,一旦用户登录,他/她就会自动重定向到我的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作为答案,以及登录页面的位置标题!)。由于调试起来相当困难,我有点卡住了。
任何人都知道可能会失败的是什么?
最后,我必须承认,我正在努力实现的目标没有任何解决方案。从某种意义上说,这实际上是一个好消息,因为它证明了谷歌的安全性并不容易打破! 问题已经结束。
答案 0 :(得分:0)
也许这部分App Engine文档是相关的?
https://developers.google.com/appengine/docs/python/urlfetch/overview#Secure_Data_Connection
答案 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。