oauth2 OAuthServiceFactory.getOAuthService()。getCurrentUser()崩溃

时间:2015-01-26 21:58:10

标签: google-app-engine oauth-2.0 google-oauth google-openid

上下文:

我有一个angularJs应用程序,在app引擎上运行了一个运动衫bachend服务器。到目前为止,我使用(更简单的)openId APi来验证我的用户,但现在看来这将被删除,oAuth2是“新”的东西。

问题:

我有以下代码使用apacha oltu来验证我的用户:

  @GET
  public Response step1()
      throws ServletException, IOException, URISyntaxException, OAuthSystemException {

    OAuthClientRequest request = OAuthClientRequest
    .authorizationProvider(OAuthProviderType.GOOGLE)
    .setClientId(CLIENT_ID)
             .setScope("https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email")
    .setRedirectURI(REDIRECT_URI)
    .setResponseType("code")
    .buildQueryMessage();

    logger.info("start oauth process: " + request.getLocationUri());

    //We send a redirect request to the browser so it can go to the consent screen of google.
    return Response.status(Response.Status.TEMPORARY_REDIRECT).location(new URI(request.getLocationUri())).build();
  }

  @GET
  @Path("loggedin")
  public Response getCode(@QueryParam("code") String code)
      throws ServletException, IOException, URISyntaxException, OAuthSystemException, OAuthProblemException, OAuthRequestException {

    logger.info("response from redirect. We obtained the following code: " + code);

    OAuthClientRequest request = OAuthClientRequest
    .tokenProvider(OAuthProviderType.GOOGLE)
    .setGrantType(GrantType.AUTHORIZATION_CODE)
    .setClientId(CLIENT_ID)
    .setClientSecret(CLIENT_SECRET)
    .setCode(code)
             .setScope("https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email")
    .setRedirectURI(REDIRECT_URI)
    .buildBodyMessage();

    OAuthClient client = new OAuthClient(new URLConnectionClient());
    OAuthJSONAccessTokenResponse tokenResponse = client.accessToken(request, OAuthJSONAccessTokenResponse.class);

    logger.log(Level.WARNING, "token: " + tokenResponse.getAccessToken() + " valid to: " + tokenResponse.getExpiresIn());

    return Response.status(Response.Status.TEMPORARY_REDIRECT).location(new URI("../index.html")).build();
  }

现在的问题是OAuthServiceFactory.getOAuthService().getCurrentUser()与InvalidOAuthParametersException崩溃。

我在stackoverflow上发现了一个类似的问题,但解决方案不适用/对我不起作用。 oauth进程本身似乎是有序的:我获得了一个访问令牌和一个正确的有效期。 (我假设如果在进程中出现问题,我会从oltu获得一个空/空标记而不是一个看起来像标记字符串的字符串)。

以前我使用UserService来访问底层用户对象。但似乎这只适用于openId。

我的oltu方法的替代方案是使用谷歌+登录的东西。 我之所以没有这样做的原因是我只找到了一个例子而且它使用了一些javascript的东西 - 我想在服务器上严格处理所有oauth的东西而不包括任何其他的js库。

他们可以选择访问“id”的某种用户对象,“用户是否已登录”? (在UserService.getCurrentUser()中,如果用户未登录,则返回null。)

1 个答案:

答案 0 :(得分:0)

你的问题:

  

他们可以选择访问“id”的某种用户对象,“用户是否已登录”? (在UserService.getCurrentUser()中,如果用户未登录,则返回null。)

有效的堆栈溢出回答:

  

请查看问题指南,以便日后能够回答问题。这个问题过于宽泛,可能会引起舆论的回答。

现在,我不想只是嗤之以鼻,并告诉你这不是讨论的地方,因为这是一个有效的问题(虽然是一个涉及的问题)。您应该将此类问题发布到the google group for appengine