У меня есть веб-приложение, в котором пользователи должны проходить аутентификацию с помощью входа в 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) Я получаю письмо от этого токена.
Есть идеи? На этом сайте не будет базы данных / пользователей / локальных логинов. Спасибо.