From 6d177fbb3e57409b223e835eabc79009a89a1031 Mon Sep 17 00:00:00 2001
From: Vitaly Takmazov
Date: Thu, 27 Feb 2020 14:00:13 +0300
Subject: API: handle existing Google user flow
---
src/main/java/com/juick/model/Auth.java | 39 ------------------
src/main/java/com/juick/model/AuthResponse.java | 47 ++++++++++++++++++++++
.../java/com/juick/server/api/ApiSocialLogin.java | 25 +++++-------
src/main/java/com/juick/service/UserService.java | 4 +-
.../java/com/juick/service/UserServiceImpl.java | 6 +--
5 files changed, 62 insertions(+), 59 deletions(-)
delete mode 100644 src/main/java/com/juick/model/Auth.java
create mode 100644 src/main/java/com/juick/model/AuthResponse.java
(limited to 'src/main')
diff --git a/src/main/java/com/juick/model/Auth.java b/src/main/java/com/juick/model/Auth.java
deleted file mode 100644
index 45185ace..00000000
--- a/src/main/java/com/juick/model/Auth.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2008-2019, Juick
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-
-package com.juick.model;
-
-/**
- * Created by vt on 09/02/16.
- */
-public class Auth {
- private final String account;
- private final String authCode;
-
- public Auth(String account, String authCode) {
- this.account = account;
- this.authCode = authCode;
- }
-
- public String getAccount() {
- return account;
- }
-
- public String getAuthCode() {
- return authCode;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/juick/model/AuthResponse.java b/src/main/java/com/juick/model/AuthResponse.java
new file mode 100644
index 00000000..b229c7ac
--- /dev/null
+++ b/src/main/java/com/juick/model/AuthResponse.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2008-2019, Juick
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package com.juick.model;
+
+import com.juick.server.api.Users;
+
+/**
+ * Created by vt on 09/02/16.
+ */
+public class AuthResponse {
+ private final Users.SecureUser user;
+ private final String account;
+ private final String authCode;
+
+ public AuthResponse(Users.SecureUser user, String account, String authCode) {
+ this.user = user;
+ this.account = account;
+ this.authCode = authCode;
+ }
+
+ public String getAccount() {
+ return account;
+ }
+
+ public String getAuthCode() {
+ return authCode;
+ }
+
+ public Users.SecureUser getUser() {
+ return user;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/juick/server/api/ApiSocialLogin.java b/src/main/java/com/juick/server/api/ApiSocialLogin.java
index 8ca7d6d8..6a6b4293 100644
--- a/src/main/java/com/juick/server/api/ApiSocialLogin.java
+++ b/src/main/java/com/juick/server/api/ApiSocialLogin.java
@@ -32,7 +32,7 @@ import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
-import com.juick.model.Auth;
+import com.juick.model.AuthResponse;
import com.juick.model.facebook.User;
import com.juick.server.util.HttpBadRequestException;
import com.juick.service.CrosspostService;
@@ -40,20 +40,11 @@ import com.juick.service.EmailService;
import com.juick.service.UserService;
import com.juick.model.vk.UsersResponse;
import com.nimbusds.jose.JOSEException;
-import com.nimbusds.jose.JWSAlgorithm;
-import com.nimbusds.jose.jwk.source.JWKSource;
-import com.nimbusds.jose.jwk.source.RemoteJWKSet;
import com.nimbusds.jose.proc.BadJOSEException;
-import com.nimbusds.jose.proc.JWSKeySelector;
-import com.nimbusds.jose.proc.JWSVerificationKeySelector;
-import com.nimbusds.jose.proc.SecurityContext;
-import com.nimbusds.jwt.proc.ConfigurableJWTProcessor;
-import com.nimbusds.jwt.proc.DefaultJWTClaimsVerifier;
-import com.nimbusds.jwt.proc.DefaultJWTProcessor;
-import net.minidev.json.JSONObject;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
+import org.checkerframework.checker.units.qual.A;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
@@ -69,7 +60,6 @@ import org.springframework.web.util.UriComponentsBuilder;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import java.io.IOException;
-import java.net.URL;
import java.security.GeneralSecurityException;
import java.text.ParseException;
import java.util.Collections;
@@ -120,6 +110,8 @@ public class ApiSocialLogin {
private EmailService emailService;
@Inject
private AppleClientSecretGenerator clientSecretGenerator;
+ @Inject
+ private Users users;
private final HttpTransport transport = new NetHttpTransport();
private final JsonFactory jsonFactory = new JacksonFactory();
@@ -254,17 +246,20 @@ public class ApiSocialLogin {
}
@ResponseBody
@PostMapping("/api/_google")
- public ResponseEntity googleSignIn(@RequestParam(name = "idToken") String idTokenString)
+ public ResponseEntity googleSignIn(@RequestParam(name = "idToken") String idTokenString)
throws GeneralSecurityException, IOException {
logger.info("Token: {}", idTokenString);
logger.info("Client: {}", googleClientId);
GoogleIdToken idToken = verifier.verify(idTokenString);
if (idToken != null) {
String email = idToken.getPayload().getEmail();
- if (userService.getUserByEmail(email).isAnonymous()) {
+ com.juick.User visitor = userService.getUserByEmail(email);
+ if (visitor.isAnonymous()) {
String verificationCode = RandomStringUtils.randomAlphanumeric(8).toUpperCase();
emailService.addVerificationCode(null, email, verificationCode);
- return ResponseEntity.ok(new Auth(email, verificationCode));
+ return ResponseEntity.ok(new AuthResponse(null, email, verificationCode));
+ } else {
+ return ResponseEntity.ok(new AuthResponse(users.getMe(visitor), null, null));
}
}
return ResponseEntity.status(HttpStatus.FORBIDDEN).body(null);
diff --git a/src/main/java/com/juick/service/UserService.java b/src/main/java/com/juick/service/UserService.java
index cc834173..71b38594 100644
--- a/src/main/java/com/juick/service/UserService.java
+++ b/src/main/java/com/juick/service/UserService.java
@@ -19,7 +19,7 @@ package com.juick.service;
import com.juick.Message;
import com.juick.User;
-import com.juick.model.Auth;
+import com.juick.model.AuthResponse;
import javax.annotation.Nonnull;
import java.util.Collection;
@@ -113,7 +113,7 @@ public interface UserService {
List getAllJIDs(User user);
- List getAuthCodes(User user);
+ List getAuthCodes(User user);
List getEmails(User user);
diff --git a/src/main/java/com/juick/service/UserServiceImpl.java b/src/main/java/com/juick/service/UserServiceImpl.java
index dc35f361..9f01b4db 100644
--- a/src/main/java/com/juick/service/UserServiceImpl.java
+++ b/src/main/java/com/juick/service/UserServiceImpl.java
@@ -20,7 +20,7 @@ package com.juick.service;
import com.juick.Message;
import com.juick.User;
import com.juick.model.AnonymousUser;
-import com.juick.model.Auth;
+import com.juick.model.AuthResponse;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
@@ -630,10 +630,10 @@ public class UserServiceImpl extends BaseJdbcService implements UserService {
@Transactional(readOnly = true)
@Override
- public List getAuthCodes(final User user) {
+ public List getAuthCodes(final User user) {
return getJdbcTemplate().query(
"SELECT account,authcode FROM auth WHERE user_id=? AND protocol='xmpp'",
- (rs, num) -> new Auth(rs.getString(1), rs.getString(2)),
+ (rs, num) -> new AuthResponse(null, rs.getString(1), rs.getString(2)),
user.getUid());
}
--
cgit v1.2.3