Как я могу генерировать и проверять токен с длинным идентификатором пользователя Java Spring Auth JWT - PullRequest
0 голосов
/ 27 апреля 2019

Я создаю смс для входа в систему с помощью набора учетных записей Facebook, java и jwt token, кажется, что он работает нормально, но я не могу добавить пользователя с длинным идентификатором к заявкам на предъявителя токена как к югу.

это мой код службы Facebook, я могу найти пользователя или создать пользователя, но я не знаю, как найти длинный идентификатор пользователя из findByAccountKit.

    public FBToken authorizeToken(String appId, String appSecret, String code) throws FacebookException {
        String authUrl = this.environment.getProperty(FacebookConstant.CONFIG_FB_GRAPH_AK_URL_ACCESS_TOKEN)
                + "?grant_type=authorization_code&code=" + code + "&access_token=AA|" + appId + "|" + appSecret;
        log.info("authUrl : " + authUrl );

        Object obj = this.restTemplate.getForObject(authUrl, Object.class);

        @SuppressWarnings("unchecked")
        Map<String, Object> info = (HashMap<String,Object>) obj;
        String user_id = (String) info.get("id");
        String user_access_token = (String) info.get("access_token");

        String me_endpoint_uri = this.environment.getProperty(FacebookConstant.CONFIG_FB_GRAPH_AK_URL_ME) + "?access_token=" + user_access_token;
        Object me = restTemplate.getForObject(me_endpoint_uri,Object.class);

        //Set Phone User Object
        @SuppressWarnings("unchecked")
        Map<String, Object> map = (HashMap<String,Object>) me;
        @SuppressWarnings("unchecked")
        Map<String, Object> phone = (HashMap<String,Object>) map.get("phone");
        String number = (String) phone.get("number");

        String acccountKit  = (String) info.get("id");

        User userSMS = userRepository.findByAcccountKit(acccountKit);

        if (userSMS == null) {  

                     // Sign up user and login
                        User user = new User();
                        user.setAcccountKit(user_id);
                        user.setPhoneNumber(number);
                        user.setToken(user_access_token);
                        System.out.println(user);

                        User result = userRepository.save(user);
        }

        FBToken response= new FBToken();

        try {   
                response = this.restTemplate.getForObject(authUrl, FBToken.class);



            } catch (Exception e) {
                // TODO: handle exception
                log.error(e);
            }
         System.out.println(response);

        log.info("Token : " + code + " | response : " + response);

        return response;
    }

    public String getRegisteredMobileNumberToken(String code) throws FacebookException {
        return null;
    }


    public User authorizeToken(String code, String mobile) throws FacebookException {
        User login = new User();
        FBToken fbToken = authorizeToken(this.environment.getProperty(FacebookConstant.CONFIG_FB_GRAPH_AK_APP_ID),
                this.environment.getProperty(FacebookConstant.CONFIG_FB_GRAPH_AK_APP_SECRET), code);


        if(fbToken.getAccess_token() == null) {
            login.setUsername(mobile);
        }

        return login;
    }

это моя конечная точка для входа в систему и регистрации пользователей

@Validated
@RestController
@RequestMapping(value = "/login/fb")
public class LoginFBController {

    @Autowired
    private JwtTokenHandler jwtTokenHandler;

    @Autowired
    private AccountKitService accountKitService;

    @PostMapping("/ak")
    public APIResponse loginViaFB(@RequestParam String mobile, @RequestParam String code) throws FacebookException {
        return manipulateLoginResponse(this.accountKitService.authorizeToken(code, mobile));
    }

    private APIResponse manipulateLoginResponse(User user){
        APIResponse apiResponse = new APIResponse();  

        if (user.getUsername() == null) {
            apiResponse.setMessage("Authentication failed");
            apiResponse.setStatus(false);
            apiResponse.setStatusCode(HttpStatus.UNAUTHORIZED.value());
        } else {
            String token = jwtTokenHandler.generate(user.getUsername(), user.getAcccountKit());
            apiResponse.setAccessToken(token);
            apiResponse.setTokenType("Bearer");
            apiResponse.setMessage("Authenticated");
            apiResponse.setStatus(true);
            apiResponse.setStatusCode(HttpStatus.OK.value());

        }
        return apiResponse;
    }

}

Это мой дескриптор токена генерировать и проверять

    public String generate(String username) {

        Claims claims = Jwts.claims().setSubject(username);

        Date now = new Date();
        Date expiryDate = new Date(now.getTime() + jwtExpirationInMs);

        return Jwts.builder()
                .setIssuedAt(new Date())
                .setExpiration(expiryDate)
                .setClaims(claims)
                .signWith(SignatureAlgorithm.HS512, jwtSecret)
                .compact();

    }

    public JwtUserDetails validate (String token) {
        JwtUserDetails jwtUserDetails = null;
        try {
            Claims body = Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(token).getBody();

            jwtUserDetails = new JwtUserDetails(body.getSubject(), token);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return jwtUserDetails;
    }

Код работает для генерации и проверки токена, но я бы хотел добавить длинный идентификатор пользователя в заявки, тогда было бы легко найти пользователя по идентификатору. У кого-нибудь есть идея? спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...