Я работаю над приложением 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.Спасибо.