Доступ к SCIM API - Keyrock Fiware

Я использую образ fiware-idm в контейнере докеров (https://hub.docker.com/r/fiware/idm/) и пытаюсь получить доступ к SCIM API. Есть пользователь "idm" (пользователь по умолчанию), он провайдер и имеет все права. Но когда я пытаюсь получить всех пользователей:

private String getAccessToken() {
    HttpServletRequest httpServletRequest = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
    HttpSession session = httpServletRequest.getSession();
    String accessToken = (String) session.getAttribute("access_token");
    return accessToken;
}

public void getUsers() throws IOException {
    String accessToken = getAccessToken(); 

    Client client = ClientBuilder.newClient();
    Response response = client.target("http://192.168.99.100:5000/v3/projects")
      .request(MediaType.TEXT_PLAIN_TYPE)
      .header("X-Auth-token", accessToken)
      .get();

    setResultUsersList("-- status: " + response.getStatus() + " <br>" 
            + "-- headers: " + response.getHeaders() + " <br>"
            + "-- body: " + response.readEntity(String.class) + " <br>"
            + "-- token: " + accessToken);
}

Я получаю сообщение об ошибке: {"error": {"message": "Выполненный вами запрос требует аутентификации.", "code": 401, "title": "Неавторизованный"}}

Но аутентификация работает и также получает информацию о пользователе:

public void authenticateUser() throws OAuthSystemException, IOException {
    HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();

    OAuthClientRequest codeRequest = OAuthClientRequest
            .authorizationLocation("http://192.168.99.100:8000/oauth2/authorize")
            .setParameter("response_type", "code")
            .setClientId(CLIENT_ID)
            .setRedirectURI("http://localhost:8080/Example-Application-Security-UI/auth")
            .buildQueryMessage();

    httpServletResponse.sendRedirect(codeRequest.getLocationUri());
}

public void requestUserInfo() {
    HttpServletRequest httpServletRequest = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
    HttpSession session = httpServletRequest.getSession();
    accessToken = (String) session.getAttribute("access_token");

    String strJson = callWebservice("http://192.168.99.100:8000/user?access_token=" + accessToken);
    JSONObject jsonObject = new JSONObject(strJson);
    resultUserInfo = jsonObject.toString();
}

person Gabriela Cavalcante    schedule 10.10.2016    source источник


Ответы (1)


Заголовок X-Auth-Token, необходимый при отправке запросов к Keystone, требует в качестве значения токен Keystone вместо токена доступа OAuth2, который вы предоставляете в настоящее время.

Вы можете получить токен Keystone с помощью запроса POST к конечной точке аутентификации. Поскольку одним из поддерживаемых методов аутентификации в Keystone является OAuth2, вы даже можете использовать токен доступа, полученный при аутентификации OAuth2, для получения токена Keystone:

POST  /v3/auth/tokens
body:

 "auth": {
        "identity": {  
            "methods": [
                "oauth2"
            ],
            "oauth2": {
                'access_token_id': access_token
            }
        }
    }

Теперь вы можете использовать токен Keystone для выполнения запросов к API SCIM (или к любой конечной точке API, к которой у аутентифицированного пользователя есть разрешения).

Надеюсь, это поможет вам!

Обратите внимание, что запрос на получение информации о пользователе работает, поскольку он выполняется для конечной точки в Horizon, а не для конечной точки Keystone.

person Federico Fernández    schedule 19.10.2016
comment
Благодарю вас! Это работает, я делал запрос с телом: - person Gabriela Cavalcante; 21.10.2016
comment
**с телом: ....методы: [пароль]..., но сейчас лучше использовать oauth2. Спасибо! - person Gabriela Cavalcante; 21.10.2016