Невозможно выполнить одновременный вход в систему с помощью аутентификации Google - PullRequest
0 голосов
/ 08 января 2019

У меня есть веб-приложение, в котором пользователи должны проходить аутентификацию с помощью входа в Google. Я делаю это, потому что мне нужно получить их адрес электронной почты. Когда они заполняют поля на странице, все эти данные сохраняются в листе Google вместе с их адресом электронной почты (в целях аудита, если что-то искажается с данными). К сожалению, происходит то, что, если пользователь A входит в систему и выполняет некоторую работу, и в то же время пользователь B входит в систему, когда пользователь A отправляет данные, они будут отправлять адрес электронной почты пользователя B (как и пользователь B). Короче говоря, последний человек, чтобы войти, этот адрес электронной почты используется. Там нет базы данных, и я не храню куки. Когда они обновляют страницу, они должны пройти повторную аутентификацию. Я использую Angular 7 и Java. Вот код, который я использовал:

ngOnInit() {
  gapi.load('auth2', () => {
    this.auth2 = gapi.auth2.init({
      client_id: 'CLIENT_ID_HERE',
      // Scopes to request in addition to 'profile' and 'email'
      scope: 'https://www.googleapis.com/auth/spreadsheets'
    });
  });
}

signInWithGoogle(): void {
  this.auth2.grantOfflineAccess().then((authResult) => {
    this.authCode = authResult['code'];
    this.fetchData();
  });
}

authCode привязан к дочернему компоненту, поэтому его можно передать в качестве параметра запроса в код Java для Google Auth.

this.seriesService.submitSeriesData(matchList, this.authToken).subscribe(res => {.....);

Java-код Google Auth выглядит так:

private static final String APPLICATION_NAME = "Google Sheets API Java";
private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();

private static final List<String> SCOPES = Collections.singletonList(SheetsScopes.SPREADSHEETS);
private static final String CLIENT_SECRET_DIR = "/client_secret.json";

private static GoogleTokenResponse tokenResponse = null;

public static String getEmailAddress() throws IOException {
        GoogleIdToken idToken = tokenResponse.parseIdToken();
        GoogleIdToken.Payload payload = idToken.getPayload();
        String email = payload.getEmail();
        return email;
}

public static Sheets getSheetsService1(String token, String redirectUri) throws IOException, GeneralSecurityException {

        // Exchange auth code for access token
    InputStream in = GoogleAuthUtil.class.getResourceAsStream(CLIENT_SECRET_DIR);
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
        tokenResponse =
                  new GoogleAuthorizationCodeTokenRequest(
                      new NetHttpTransport(),
                      JacksonFactory.getDefaultInstance(),
                      "https://www.googleapis.com/oauth2/v4/token",
                      clientSecrets.getDetails().getClientId(),
                      clientSecrets.getDetails().getClientSecret(),
                      token,
                      redirectUri)
                  .execute();

        String accessToken = tokenResponse.getAccessToken();

        GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken);

        Sheets service = new Sheets.Builder(new NetHttpTransport(), JacksonFactory.getDefaultInstance(), credential)
                .setApplicationName("MY APP HERE")
                .build();

        return service;
}

И конечная точка:

@RequestMapping(value="series/data", method = RequestMethod.POST, consumes="application/json")
public boolean submitSeriesMatchData(@RequestBody(required=true) SubmitStatsDto request) throws IOException, GeneralSecurityException, Exception {
  if (service == null) {
    service = GoogleAuthUtil.getSheetsService1(request.getToken(), this.redirectUri);
  }
  ......
}

1) Пользователь нажимает на кнопку входа в Google 2) Они выбирают электронную почту и авторизуются с помощью Google 3) Я получаю код авторизации и сохраняю его в ng. 4) Каждому вызову REST передается указанный токен для аутентификации через google, и каждая конечная точка вызывает getSheetsService1, который аутентифицирует токен. (несколько конечных точек, я только показал один выше) 5) Я получаю письмо от этого токена.

Есть идеи? На этом сайте не будет базы данных / пользователей / локальных логинов. Спасибо.

...