2016-10-10 9 views
0

도커 컨테이너 (https://hub.docker.com/r/fiware/idm/)에서 fiware-idm 이미지를 사용하고 있으며 SCIM API에 액세스하려고합니다. 사용자 "idm"(기본 사용자)이 있으며, 그는 공급자이며 모든 권한을가집니다. 하지만 모든 사용자가 얻을 때 :SCIM API에 액세스 - Keyrock Fiware

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); 
} 

내가 오류 MSG가 나타날 수 가 { "오류": { "메시지": ". 당신이 만든 요청이 인증을 요구", "코드를"401 " 제목 ":": 대신

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(); 
} 

답변

0

키스톤에 요청을 할 때 필요한 X-Auth-Token 헤더 값으로 키스톤 토큰을 요구}} "무단

그러나 인증 작품과도 사용자 정보를 정기적으로받을 OAuth2 acc 현재 제공하고있는 토큰입니다.

인증 끝 점이 POST 요청을 사용하여 키스톤 토큰을 얻을 수 있습니다.

POST /v3/auth/tokens 
body: 

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

이제 요청을 수행하기 위해 키스톤 토큰을 사용할 수 있습니다 : 키스톤에서 지원되는 인증 방법 중 하나가 OAuth2를을하기 때문에, 당신은 심지어 키스톤 토큰을 얻기 위해 당신은 OAuth2를 인증에서 얻은 액세스 토큰을 사용할 수 있습니다 SCIM API (또는 인증 된 사용자에게 권한이있는 모든 API 엔드 포인트)로 전송할 수 있습니다.

희망이 도움이됩니다.

사용자 정보를 얻으려는 요청은 Keystone 끝점이 아닌 Horizon의 끝점으로 수행되기 때문에 작동한다는 점에 유의하십시오.

+0

고맙습니다! 작동 중입니다. 몸으로 요청했습니다. –

+0

** body : .... "methods": [ "password"] ...하지만 이제는 oauth2를 사용하는 것이 좋습니다. 감사! –