我有一个网络应用,用户必须使用Google登录进行身份验证。我这样做是因为我需要获取他们的电子邮件地址。当他们填写页面上的字段时,所有这些数据都与他们的电子邮件地址一起存储在google工作表中(出于审计目的,以防数据中出现歪斜)。不幸的是,发生的情况是,如果用户A登录并执行一些工作,并且用户B同时登录,则当用户A提交数据时,他们将提交用户B的电子邮件地址(用户B也是如此)。简而言之,使用该电子邮件地址的最新登录者。没有数据库,我不存储任何cookie。当他们刷新页面时,他们必须重新进行身份验证。我正在使用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绑定到子组件,因此可以作为查询参数传递给Google auth的Java代码。
this.seriesService.submitSeriesData(matchList, this.authToken).subscribe(res => {.....);
google auth java代码如下:
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)我从该tokenResponse收到电子邮件。
有什么想法吗?该站点将没有数据库/用户/本地登录名。谢谢。