2

我有一个客户端测试应用程序和一个服务器应用程序,它们都托管在 GAE 上。客户端是一个简单的 Web 前端,服务器托管受 Oauth 保护的资源。身份验证通过 OpenId 进行,应用程序支持联合登录。问题是用户登录后,userService 似乎忘记了他们是谁(浏览器有一个 ACSID cookie,所以它记得)。

这是流程(来自 GAE 日志).... 用户首先在浏览器中输入 cktestclient.appspot.com(客户端应用程序)并按下 ShowMyCommitments 按钮。然后在服务器端日志(commitkeeperapi.appspot.com)中看到以下内容。

上午 9:10:22:/oauth/authorize?response_type=code&client_id=webappclient&redirect_uri= http://cktestclient.appspot.com/client/showStartPage&scope=CommitKeeper_Access 我们还没有登录,所以我们将在 9:10 被重定向:上午 22 点:/login/?continue= http://commitkeeperapi.appspot.com/oauth/authorize?response_type=code&client_id=webappclient&redirect_uri=http://cktestclient.appspot.com/client/showStartPage&scope=CommitKeeper_Access 然后我使用 url 登录由 createLoginURL 生成

上午 9:10:33:/oauth/authorize?response_type=code&client_id=webappclient&redirect_uri= http://cktestclient.appspot.com/client/showStartPage&scope=CommitKeeper_Access OAuth 继续进行,我们看到我们有一个登录用户 com.fourspires。 api.server.MyGaeAuthenticator 身份验证:当前用户(来自 userService)是:richardlandis@gmail.com

上午 9:10:34:/oauth/access_token 更多 Oauth Dancing... 获取 oAuthToken,在 cktestclient.appspot.com:/client/showStartPage 返回客户端 - 它继续在 commitkeeperapi.appspot.com:/v3 进行调用/承诺

上午 9:10:34:/oauth/validate Dancing... 验证与承诺请求一起发送的 oAuthToken

上午 9:10:36:/v3/commitments/?oauth_token=9491caca6c9ad2b2cb2d20a5cf2773ce22b99e076ff0dcb3a47d06e6a26038d5ccf63c66f1f2387e 现在我们回到服务器代码并检查用户 - 它是空的!
com.fourspires.api.util.UserHelpers getCurrentUser:UserServiceFactory.getUserService().getCurrentUser() = null

基于查看我在这个问题上可以找到的所有线程,我在服务器的 appengine-web.xml 中添加了 true - 但没有任何改变。

有谁知道为什么 UserService 丢失了我的用户的踪迹?我有一个解决这个问题的方法,但我有兴趣更多地了解为什么会失败。

PS - 这似乎与GWT 和 AppEngine 用户服务非常相似,但似乎尚未解决。

4

1 回答 1

0

我相信答案是因为我提出的两个请求是由不同的 ApiProxy 处理的,它们有不同的环境,因此对当前用户是谁的理解不同。我不确定为什么我会得到两个不同的 ApiProxy,但我可以对此进行进一步调查。

于 2012-07-16T19:12:16.903 回答