无法使用Google Auth进行并发登录

时间:2019-01-08 14:56:40

标签: java angular google-sheets google-oauth google-authentication

我有一个网络应用,用户必须使用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收到电子邮件。

有什么想法吗?该站点将没有数据库/用户/本地登录名。谢谢。

0 个答案:

没有答案