All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.garmin.service.OAuthServiceImpl Maven / Gradle / Ivy

The newest version!
package com.garmin.service;

import com.garmin.client.GarminClient;
import com.garmin.config.GarminConfig;
import com.garmin.model.GarminTokenInfo;
import com.garmin.util.Consts;
import com.garmin.util.ObjectUtils;
import com.garmin.vo.ResponseToken;
import com.garmin.vo.UserInfo;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;

import java.lang.reflect.Field;
import java.net.URI;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * @Classname OAuthServiceImpl
 * @Description TODO
 * @Date 2019/10/24 10:27
 * @Created by weihua.zou
 */
@Service
@Slf4j
public class OAuthServiceImpl implements OAuthService{
    private static Map cacheMap =new HashMap<>();
    private final GarminConfig garminConfig;
    private final GarminClient garminClient;

    public OAuthServiceImpl(GarminConfig garminConfig, GarminClient garminClient) {
        this.garminConfig = garminConfig;
        this.garminClient = garminClient;
    }
    public ResponseEntity oauth(String sid) throws Exception{
        log.info("oauth is start ,userName:{}", sid);
        if(garminConfig==null){
            return new ResponseEntity<>("Garmin configuration initialization failed", HttpStatus.BAD_REQUEST);
        }
        if(StringUtils.isBlank(garminConfig.getRequestTokenUrl())){
            return new ResponseEntity<>("requestTokenUrl is not configured",HttpStatus.BAD_REQUEST);
        }
        if(StringUtils.isBlank(garminConfig.getOauthConfirmUrl())){
            return new ResponseEntity<>("oauthConfirmUrl is not configured",HttpStatus.BAD_REQUEST);
        }
        if(StringUtils.isBlank(garminConfig.getCallBackUrl())){
            return new ResponseEntity<>("callBackUrl is not configured",HttpStatus.BAD_REQUEST);
        }
        if(StringUtils.isBlank(garminConfig.getOauthConfirmUrl())){
            return new ResponseEntity<>("oauthConfirmUrl is not configured",HttpStatus.BAD_REQUEST);
        }
        if(StringUtils.isBlank(garminConfig.getConsumerkey())){
            return new ResponseEntity<>("consumerkey is not configured",HttpStatus.BAD_REQUEST);
        }
        if(StringUtils.isBlank(garminConfig.getConsumerSecret())){
            return new ResponseEntity<>("consumerSecret is not configured",HttpStatus.BAD_REQUEST);
        }
        if(StringUtils.isBlank(garminConfig.getOauthAccessTokenUrl())){
            return new ResponseEntity<>("oauthAccessTokenUrl is not configured",HttpStatus.BAD_REQUEST);
        }
        String accessTokenSecret=garminClient.getRequestTokenSecret();
        if(StringUtils.isBlank(accessTokenSecret)){
            return new ResponseEntity<>("tokenSecret get failed",HttpStatus.BAD_REQUEST);
        }
        HttpHeaders httpHeaders = new HttpHeaders();
        String[] tokenAndSecret = accessTokenSecret.split(Consts.VARIABLE_DELIMTER);
        String[] tokenValue = tokenAndSecret[0].split(Consts.VALUE_DELIMTER);
        String[] secretValue = tokenAndSecret[1].split(Consts.VALUE_DELIMTER);
        GarminTokenInfo garminTokenInfo = new GarminTokenInfo();
        garminTokenInfo.setSecret(secretValue[1]);
        garminTokenInfo.setToken(tokenValue[1]);
        garminTokenInfo.setUserName(sid);
        garminTokenInfo.setUserId(UUID.randomUUID().toString());
        cacheMap.put(tokenValue[1],garminTokenInfo);
        if(!garminConfig.isAutoJumpPage()){
            ResponseToken responseToken = new ResponseToken();
            responseToken.setCode(200);
            responseToken.setData(getOAuthConfirmURL(tokenValue[1]));
            return new ResponseEntity<>(responseToken,HttpStatus.OK);
        }
        URI uri = new URI(getOAuthConfirmURL(tokenValue[1]));
        httpHeaders.setLocation(uri);
        return new ResponseEntity<>(httpHeaders, HttpStatus.SEE_OTHER);
    }

    public ResponseEntity  getUserAccessTokenAndSecret(String oauthTokenValue, String oauthVerifierValue) throws Exception {
        log.info("getUserAccessTokenAndSecret oauthTokenValue:{},oauthVerifierValue:{}",oauthTokenValue,oauthVerifierValue);
        String accessTokenUrl = garminConfig.getOauthAccessTokenUrl() + Consts.URL_DELIMTER + Consts.OAUTH_VERIFIER + Consts.VALUE_DELIMTER+ oauthVerifierValue;
        UserInfo userInfo = new UserInfo();
        if(!cacheMap.containsKey(oauthTokenValue)){
            log.info("{} is not in cacheMap" ,oauthTokenValue);
            throw  new Exception("认证失败");
        }
        GarminTokenInfo reqToken = cacheMap.get(oauthTokenValue);
        cacheMap.remove(oauthTokenValue);
        log.info("accessTokenUrl:{},reqToken:{}",accessTokenUrl,reqToken);
        String accessTokenSecret =garminClient.generateAccessTokenSecret(accessTokenUrl, reqToken);
        log.info("accessTokenSecret:{}",accessTokenSecret);
        ResponseToken responseToken =new ResponseToken();
        if(StringUtils.isBlank(accessTokenSecret)){
            responseToken.setCode(HttpStatus.OK.value());
            responseToken.setData(userInfo);
            return new ResponseEntity<>(responseToken,HttpStatus.OK);
        }
        if(accessTokenSecret.contains(Consts.OAUTH_TOKEN)){
            String[] tokenAndSecret = accessTokenSecret.split(Consts.VARIABLE_DELIMTER);
            String[] tokenValue = tokenAndSecret[0].split(Consts.VALUE_DELIMTER);
            String[] secretValue = tokenAndSecret[1].split(Consts.VALUE_DELIMTER);
            String name = tokenAndSecret[3];
            userInfo.setUserId(tokenAndSecret[2]);
            userInfo.setSid(name);
            userInfo.setUserAccessToken(tokenValue[1]);
            userInfo.setUserAccessSecret(secretValue[1]);
        }
        if(StringUtils.isNotBlank(garminConfig.getNotifyUrl())){
            URI uri = new URI(garminConfig.getNotifyUrl()+ ObjectUtils.mapToString(userInfo,true));
            HttpHeaders httpHeaders = new HttpHeaders();
            httpHeaders.setLocation(uri);
            return new ResponseEntity<>(httpHeaders, HttpStatus.SEE_OTHER);
        }
        responseToken.setCode(HttpStatus.OK.value());
        responseToken.setData(userInfo);
        return new ResponseEntity<>(responseToken,HttpStatus.OK);
    }

    private String getOAuthConfirmURL(String accessToken)
    {
        return garminConfig.getOauthConfirmUrl() + Consts.URL_DELIMTER + Consts.OAUTH_TOKEN + Consts.VALUE_DELIMTER + accessToken + Consts.VARIABLE_DELIMTER + Consts.CALLBACK_URL + '=' + garminConfig.getCallBackUrl();
    }

}