From 10dcb7324fac83c0190ff4a842360a035449f278 Mon Sep 17 00:00:00 2001 From: Vitaly Takmazov Date: Tue, 20 Jun 2023 07:10:16 +0300 Subject: VK: read premium status using Callback API --- .../com/juick/www/controllers/SocialLogin.java | 109 +++++++-------------- 1 file changed, 37 insertions(+), 72 deletions(-) (limited to 'src/main/java/com/juick/www/controllers') diff --git a/src/main/java/com/juick/www/controllers/SocialLogin.java b/src/main/java/com/juick/www/controllers/SocialLogin.java index b0738fea..0cac26c5 100644 --- a/src/main/java/com/juick/www/controllers/SocialLogin.java +++ b/src/main/java/com/juick/www/controllers/SocialLogin.java @@ -27,6 +27,7 @@ import com.juick.model.ext.vk.UsersResponse; import com.juick.service.EmailService; import com.juick.service.TelegramService; import com.juick.service.UserService; +import com.juick.service.VKService; import com.juick.service.security.entities.JuickUser; import com.juick.util.HttpBadRequestException; @@ -81,21 +82,17 @@ public class SocialLogin { private String FACEBOOK_SECRET; @Value("${ap_base_uri:http://localhost:8080/}") private String baseUri; - private static final String VK_REDIRECT = "http://juick.com/_vklogin"; private static final String TWITTER_VERIFY_URL = "https://api.twitter.com/1.1/account/verify_credentials.json"; @Inject private ObjectMapper jsonMapper; private ServiceBuilder twitterBuilder; - private OAuth20Service facebookAuthService, vkAuthService, appleSignInService; - + private OAuth20Service facebookAuthService, appleSignInService; + @Inject + private VKService vkService; @Value("${twitter_consumer_key:appid}") private String twitterConsumerKey; @Value("${twitter_consumer_secret:secret}") private String twitterConsumerSecret; - @Value("${vk_appid:appid}") - private String VK_APPID; - @Value("${vk_secret:secret}") - private String VK_SECRET; @Value("${telegram_token:secret}") private String telegramToken; @Value("${apple_app_id:appid}") @@ -115,13 +112,11 @@ public class SocialLogin { public void init() { ServiceBuilder facebookBuilder = new ServiceBuilder(FACEBOOK_APPID); twitterBuilder = new ServiceBuilder(twitterConsumerKey); - ServiceBuilder vkBuilder = new ServiceBuilder(VK_APPID); + UriComponentsBuilder redirectBuilder = UriComponentsBuilder.fromUriString(baseUri); String facebookRedirectUri = redirectBuilder.replacePath("/_fblogin").build().toUriString(); facebookAuthService = facebookBuilder.apiSecret(FACEBOOK_SECRET).callback(facebookRedirectUri) .defaultScope("email").build(FacebookApi.instance()); - vkAuthService = vkBuilder.apiSecret(VK_SECRET).defaultScope("friends,wall,offline,groups").callback(VK_REDIRECT) - .build(VkontakteApi.instance()); ServiceBuilder appleSignInBuilder = new ServiceBuilder(appleApplicationId); String appleSignInRedirectUri = redirectBuilder.replacePath("/_apple").build().toUriString(); appleSignInService = appleSignInBuilder.callback(appleSignInRedirectUri).defaultScope("email") @@ -249,7 +244,7 @@ public class SocialLogin { vkstate = UUID.randomUUID().toString(); Cookie c = new Cookie("vkstate", vkstate); response.addCookie(c); - return "redirect:" + vkAuthService.getAuthorizationUrl(vkstate); + return "redirect:" + vkService.getVkAuthService().getAuthorizationUrl(vkstate); } if (StringUtils.isBlank(vkstate) || !vkstate.equals(state)) { @@ -259,43 +254,44 @@ public class SocialLogin { c.setMaxAge(0); response.addCookie(c); } - OAuth2AccessToken token = vkAuthService.getAccessToken(code); + OAuth2AccessToken token = vkService.getVkAuthService().getAccessToken(code); OAuthRequest meRequest = new OAuthRequest(Verb.GET, "https://api.vk.com/method/users.get?fields=screen_name&v=5.131"); - vkAuthService.signRequest(token, meRequest); - Response vkResponse = vkAuthService.execute(meRequest); - if (vkResponse.isSuccessful()) { - String graph = vkResponse.getBody(); - com.juick.model.ext.vk.User jsonUser = jsonMapper.readValue(graph, UsersResponse.class).users().stream() - .findFirst().orElseThrow(HttpBadRequestException::new); - String vkName = jsonUser.firstName() + " " + jsonUser.lastName(); - String vkLink = jsonUser.screenName(); - - if (vkName.length() == 1 || StringUtils.isBlank(vkLink)) { - logger.error("vk user error"); - throw new HttpBadRequestException(); - } + vkService.getVkAuthService().signRequest(token, meRequest); + try (Response vkResponse = vkService.getVkAuthService().execute(meRequest)) { + if (vkResponse.isSuccessful()) { + String graph = vkResponse.getBody(); + com.juick.model.ext.vk.User jsonUser = jsonMapper.readValue(graph, UsersResponse.class).users().stream() + .findFirst().orElseThrow(HttpBadRequestException::new); + String vkName = jsonUser.firstName() + " " + jsonUser.lastName(); + String vkLink = jsonUser.screenName(); - long vkID = NumberUtils.toLong(jsonUser.id(), 0); - int uid = userService.getUIDbyVKID(vkID); - if (uid > 0) { - userService.updateVkUser(vkID, token.getAccessToken(), vkName, vkLink); - Cookie c = new Cookie("hash", userService.getHashByUID(uid)); - c.setMaxAge(50 * 24 * 60 * 60); - response.addCookie(c); - return "redirect:/" + Optional.ofNullable(referer).orElse(StringUtils.EMPTY); - } else { - String loginhash = UUID.randomUUID().toString(); - if (!userService.createVKUser(vkID, loginhash, token.getAccessToken(), vkName, vkLink)) { - logger.error("create vk user error"); + if (vkName.length() == 1 || StringUtils.isBlank(vkLink)) { + logger.error("vk user error"); throw new HttpBadRequestException(); } - return "redirect:/signup?type=vk&hash=" + loginhash; + + long vkID = NumberUtils.toLong(jsonUser.id(), 0); + int uid = userService.getUIDbyVKID(vkID); + if (uid > 0) { + userService.updateVkUser(vkID, token.getAccessToken(), vkName, vkLink); + Cookie c = new Cookie("hash", userService.getHashByUID(uid)); + c.setMaxAge(50 * 24 * 60 * 60); + response.addCookie(c); + return "redirect:/" + Optional.ofNullable(referer).orElse(StringUtils.EMPTY); + } else { + String loginhash = UUID.randomUUID().toString(); + if (!userService.createVKUser(vkID, loginhash, token.getAccessToken(), vkName, vkLink)) { + logger.error("create vk user error"); + throw new HttpBadRequestException(); + } + return "redirect:/signup?type=vk&hash=" + loginhash; + } + } else { + logger.error("vk error {}: {}", vkResponse.getCode(), vkResponse.getBody()); + throw new HttpBadRequestException(); } - } else { - logger.error("vk error {}: {}", vkResponse.getCode(), vkResponse.getBody()); - throw new HttpBadRequestException(); } } @@ -375,35 +371,4 @@ public class SocialLogin { } throw new HttpBadRequestException(); } - - @Scheduled(fixedRate = 3600000) - public void updatePremium() { - userService.getVkTokens(List.of()) - .forEach(vkUser -> { - var userId = userService.getUIDbyVKID(Long.parseLong(vkUser.getLeft())); - if (userId > 0) { - OAuth2AccessToken token = new OAuth2AccessToken(vkUser.getRight()); - OAuthRequest donRequest = new OAuthRequest(Verb.GET, - "https://api.vk.com/method/donut.isDon?owner_id=-67669480&v=5.131"); - vkAuthService.signRequest(token, donRequest); - try { - Response vkResponse = vkAuthService.execute(donRequest); - if (vkResponse.isSuccessful()) { - logger.info(vkResponse.getBody()); - var response = jsonMapper.readTree(vkResponse.getBody()); - if (response.has("response")) { - var isDon = response.get("response").intValue() > 0; - logger.info("{} is Don: {}", vkUser.getLeft(), isDon); - userService.setPremium(userId, isDon); - } else { - // token is expired or does not have "groups" permissions - userService.updateVkToken(userId, ""); - } - } - } catch (Exception e) { - logger.error("Don request error", e); - } - } - }); - } } -- cgit v1.2.3