Spring, Java: функциональность Google Диска прекращается после того, как он используется для входа в Google - PullRequest
0 голосов
/ 25 октября 2018

Я работаю над приложением Spring-MVC, в котором есть функция Google drive и Google Login.Для обеих этих целей мы используем одно и то же приложение, зарегистрированное в Google.

Когда возникает проблема?

Пример: Пользователь регистрируется для подключения к Google Drive через наше приложение, после чего пользователь может загружать / скачивать файлы на Google Drive.Теперь, когда эта же учетная запись используется для входа в систему Google (поставщик OAuth), существующая функциональность диска Google, которая работала нормально, выходит из строя.

Поскольку Google не предоставляет нам электронную почту,адрес, я не могу сопоставить токен в бэкэнде с адресом электронной почты и направить пользователя с этим токеном.Плюс, как только кнопка нажата, пользователь перенаправляется на логин Google, после чего у нас нет контроля.

Что можно сделать, чтобы устранить эту проблему?

Код для входа в Google:

  @RequestMapping(value = "/URL")
    public void googleContact(HttpServletRequest request, HttpServletResponse response){
        try {
            response.setContentType("text/html;charset=UTF-8");
            GoogleAuthorizationCodeRequestUrl authorizationCodeURL=new GoogleAuthorizationCodeRequestUrl(clientid1, baseURL+REDIRECT_URL, SCOPES);
            authorizationCodeURL.setAccessType("offline");//For future compatibility
            String authorizationURL=authorizationCodeURL.build();
            response.sendRedirect(new URL(authorizationURL).toString());
        }catch (Exception e){
            e.printStackTrace();
        }
    }

Код для подключения к Google Диску:

  @RequestMapping(value = "/URL")
    public String getGoogleLogin(HttpServletRequest request, HttpSession session) {
        String code = request.getParameter("code");
        String state = request.getParameter("state");
        String stateToken = (String) session.getAttribute("state");
        if (code == null || state == null) {
            session.setAttribute("state", helper.getStateToken());
            return helper.buildLoginUrl();
        } else if (state.equals(stateToken)) {
            session.removeAttribute("state");
            try {

                helper.saveCredentials(code);
                return "redirect:/userinfo";
            } catch (Exception e) {
                e.printStackTrace();
                return "redirect:/userinfo";
            }
        } else {
            return "redirect:/userinfo";
        }
    }

helper is our GoogleAuthorization class where we are handling Google

public class GoogleAuthorization {

  public GoogleAuthorization() {
        try {
            HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
            FileDataStoreFactory DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
        } catch (Exception ignored) {

        }
  }

  public String buildLoginUrl() {

        final GoogleAuthorizationCodeRequestUrl url = flow.newAuthorizationUrl();

        return url.setRedirectUri(baseURL+CALLBACK_URI).setState(stateToken).build();
    }

 public void saveCredentials(final String authCode) throws IOException {
        GoogleTokenResponse response = flow.newTokenRequest(authCode).setRedirectUri(baseURL+CALLBACK_URI).execute();
        Credential credential = flow.createAndStoreCredential(response, null);
        this.driveQuickstart.storeCredentials(credential);
    }

Примечание. Оба используют одно и то же зарегистрированное приложение Google.Спасибо.

...