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') 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