コード例 #1
0
  // https://developers.facebook.com/docs/howtos/login/server-side-login/#step1
  @Override
  public boolean preHandle(final HttpServletRequest req, final HttpServletResponse res)
      throws Exception {
    final String code = getParamOrCookieValue(req, "code", "fb_code");
    if (Strings.isNullOrEmpty(code)) {
      redirectToLoginDialog(res);
      return false;
    }

    final String sessionState = getParamOrCookieValue(req, "state", "fb_sessionState");
    if (Strings.isNullOrEmpty(sessionState)) {
      return false;
    }

    if (req.getParameter("signout") != null) {
      this.client.logout();
      deleteSessionCookies(res);
      res.sendRedirect(this.fbRedirectAfterLogout);
      return false;
    }

    String accessToken = readAccessToken(code);
    if (Strings.isNullOrEmpty(accessToken)) {
      redirectToLoginDialog(res);
      return false;
    }

    final String basicUserInfo = getBasicUserInfo(accessToken);
    LOG.info(basicUserInfo);

    final FacebookUser fbUser = deserializeFacebookUser(basicUserInfo);

    final String userName = fbUser.getId();
    final boolean userExists = doesUserExist(userName);
    if (userExists) {
      setAuthenticationCookies(res, code, sessionState, userName);
      res.sendRedirect(this.fbRedirectAfterLogin);
      return false;
    }

    // TODO: Remove "#1:" since it's probably in default userstore
    this.client.impersonate("#1:esocial");

    final CreateUserParams createUserParams = new CreateUserParams();
    UserInfo userInfo = new UserInfo();
    createUserParams.username = fbUser.getId();
    createUserParams.displayName = fbUser.getName();
    createUserParams.password = createPasswordHash(fbUser);
    createUserParams.userstore = "facebook";
    createUserParams.email = fbUser.getUserName() + "@facebook.com";

    userInfo.setFirstName(fbUser.getFirstName());
    userInfo.setLastName(fbUser.getLastName());
    userInfo.setNickName(fbUser.getUserName());
    userInfo.setPersonalId(fbUser.getId());

    createUserParams.userInfo = userInfo;

    this.client.createUser(createUserParams);

    final JoinGroupsParams joinGroupsParams = new JoinGroupsParams();
    // joinGroupsParams.group = "#2:Facebook";
    joinGroupsParams.groupsToJoin = new String[] {"#2:Facebook"};
    joinGroupsParams.user = "******" + userName;

    this.client.joinGroups(joinGroupsParams);
    setAuthenticationCookies(res, code, sessionState, userName);
    res.sendRedirect(this.fbRedirectAfterLogin);

    return false;
  }