Spring Boot + REST Api + Социальный вход - PullRequest
0 голосов
/ 24 ноября 2018

Мне нужно разработать какое-нибудь бэкэнд-приложение с использованием весенней загрузки (лучше всего будет 2.0, но тоже подойдет и 1.5), которое позволит войти через Facebook и Google.У меня есть следующие требования:

  • бэкэнд разрешит вход в систему с помощью Google или Facebook (и при первом входе бэкэнд должен помнить пользователя в БД),
  • бэкэнд будет публиковать ТОЛЬКО остальные конечные точки,
  • веб-интерфейс войдет в Facebook или Google, а затем отправит токен на сервер, сервер будет проверять токен на Facebook или Google (очевидно, это зависит от поставщика токенов) и вернет некоторые данные json.

Как мне этого добиться?Я видел много учебных пособий, но все они предполагают, что бэкэнд и интерфейс связаны в одном приложении.По некоторым причинам я действительно не хочу этого решения: этот сервер будет публиковать данные для нескольких приложений.Можете ли вы помочь мне с этим?Я имею в виду некоторые учебные пособия, репозиторий и т. Д. Спасибо за совет

1 Ответ

0 голосов
/ 24 ноября 2018

Google и Facebook предоставили пошаговую информацию для интеграции с их логином и проверки токена с помощью backed.Вы можете выполнить следующие шаги для получения подробной информации.

Google: https://developers.google.com/identity/sign-in/web/sign-in https://developers.google.com/identity/sign-in/web/backend-auth

Сделайте остальной вызов https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=, чтобы интегрировать и проверить токен с резервным, передайте accessToken, который был получен при успешном входе в систему с помощью веб-плагина grontend google, и сохраните информацию или подтвердите свою базу данных.

public String getGoogleTokenInfo(String accessToken) throws BadRequestException {
        log.debug("Calling Google API to get token info");
        RestTemplate restTemplate = new RestTemplate();
        String googleResponse = null;
        try {
            HttpHeaders headers = new HttpHeaders();
            headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));

            UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString("https://www.googleapis.com/oauth2/v3/tokeninfo").queryParam("id_token", accessToken);
            log.debug("google login uri {}", uriBuilder.toUriString());
            googleResponse = restTemplate.getForObject(uriBuilder.toUriString(), String.class);
            log.info("Gmail user authenticated successfully, details [{}]", googleResponse.toString());

        } catch (HttpClientErrorException e) {
            log.error("Not able to authenticate from Google");
            try {
                JsonNode error = new ObjectMapper().readValue(e.getResponseBodyAsString(), JsonNode.class);
                log.error(error.toString());
                throw new BadRequestException("Invalid access token");
            } catch (IOException mappingExp) {
                throw new BadRequestException("Invalid user");
            }
        } catch (Exception exp) {
            log.error("User is not authorized to login into system", exp);
            throw new BadRequestException("Invalid user");
        }
        return googleResponse;
    }

Facebook: https://developers.facebook.com/docs/facebook-login/web#example

Сделайте звонок на отдых https://graph.facebook.com/me?access_token= от поддержки путем передачи accessToken, полученного при успешном входе в систему с помощью веб-плагина Facebook для проверки токена, получения информации о профиле и сохранения информации в вашей БД.

public String getFacebookProfileInfo(final String accessToken) throws BadRequestException {
        log.debug("Calling Facebook API to validate and get profile info");
        RestTemplate restTemplate = new RestTemplate();
        String facebook = null;
        // field names which will be retrieved from facebook
        final String fields = "id,email,first_name,last_name";
        try {
            HttpHeaders headers = new HttpHeaders();
            headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));

            UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString("https://graph.facebook.com/me")
                    .queryParam("access_token", accessToken).queryParam("fields", fields);

            log.debug("Facebook profile uri {}", uriBuilder.toUriString());
            facebook = restTemplate.getForObject(uriBuilder.toUriString(), String.class);

            log.info("Facebook user authenticated and profile fetched successfully, details [{}]", facebook.toString());
        } catch (HttpClientErrorException e) {
            log.error("Not able to authenticate from Facebook");
            throw new BadRequestException("Invalid access token");
        } catch (Exception exp) {
            log.error("User is not authorized to login into system", exp);
            throw new BadRequestException("Invalid user";
        }
        return facebook;
    }
...