wso2is-5.2.0 SCIM запрос на создание возвращает статус 200

Я работал с интерфейсом SCIM WSO2is-5.2.0 и столкнулся с некоторыми странными проблемами.

это проект мобильного приложения, мы решили использовать WSO2 IS в качестве управления идентификацией. регистрация клиента осуществляется через интерфейс SCIM WSO2 IS.

на мобильном устройстве введите и отправьте имя пользователя и пароль через почтовое сообщение Restful с типом контента = application/json (см. ниже код TS)

 public signin(){
    let data = {"userName":this.sf.get("userName").value,
    "password":this.sf.get("password").value};
    debugger;
    this.gabriel.create(data).subscribe(
      (res) => {
        this. _res = res;
        debugger;
      },
      error => {
          console.log('somthing went wrong ');
        },
      () => {}
    );
  }

шлюз - это apache cxf JAX-RS; и мы использовали набор кодов wso2 Charon для обеспечения совместимости с WSO2 IS.

на воротах этот запрос перехватывается и интерпретируется как подкласс "org.wso2.charon.core.objects.User" (см. код ниже)

@POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/signin")
    public ScimRes signin(GubUser signin);

определение GubUser и ScimRes

public class GubUser extends User {

    private static final long serialVersionUID = 5431026567781364473L;

    public GubUser() {
        super();
    }
...


public class ScimRes {
    private int state;
    private String id;

    public int getState(){
        return this.state;
    }

    public void setState(int state){
        this.state = state;
    }
    ...

Причина расширения класса User заключается в том, что мы хотим включить некоторую дополнительную информацию из терминала. и эта дополнительная информация удаляется из объекта до того, как он будет доставлен в интерфейс WSO2 IS SCIM, так что данные, отправляемые в интерфейс WSO2 IS SCIM, на 100 % соответствуют определению пользователя (см. код ниже).

@Override
        public ScimRes signin(GubUser signin) {

            if(signin == null){
                return null;
            }

            Boolean klp = null; 
            String device = null;
            String user = null;
            try {               
                  klp = signin.getKlp();

                  if(klp != null && klp.booleanValue() == true){ 
                    device = signin.getGubDevice();
                    signin.deleteAttribute("klp");
                    signin.deleteAttribute("gubDevice");
                  }

                  Observable.just(signin)
                    .flatMap(in -> {return Observable.just(Scim.createUser(in));})
                    .subscribe(res -> this.scimRes = res);

...

теперь вызов WSO2 IS SCIM (см. код ниже)

 public class Scim {
    private static HttpClient client = new DefaultHttpClient();
    private static String basicAuthToken = setBasicAuthToken();

    public static ScimRes createUser(User user) throws CharonException, ClientProtocolException, IOException, ParseException{
        String encodedUser = new SCIMClient().encodeSCIMObject(user, SCIMConstants.JSON);
        HttpPost post = new HttpPost(Params.scimUrl);
        post.addHeader(SCIMConstants.AUTHORIZATION_HEADER, basicAuthToken);
        post.addHeader("Accept", SCIMConstants.APPLICATION_JSON);
        post.addHeader("Accept-Charset", "utf-8");
        StringEntity entity = new StringEntity(encodedUser, SCIMConstants.APPLICATION_JSON, "UTF-8");
        post.setEntity(entity );
        ScimRes scimRes = new ScimRes();
        HttpResponse res = client.execute(post);
        scimRes.setState(res.getStatusLine().getStatusCode());

        int resStatus = scimRes.getState();
        if(resStatus == HttpStatus.SC_CREATED || resStatus == HttpStatus.SC_OK ){
            InputStream is = res.getEntity().getContent();
            JSONParser jsonParser = new JSONParser();
            JSONObject jo = (JSONObject)jsonParser.parse(new InputStreamReader(is, "UTF-8"));
            scimRes.setId((String)jo.get("id"));
            is.close();

        }
        return scimRes;
    }   

программа попала в ловушку

JSONObject jo = (JSONObject)jsonParser.parse(new InputStreamReader(is, "UTF-8"));

Я получил копию заголовка сообщения http-ответа (см. ниже)

HTTP/1.1 200 OK [X-Frame-Options: DENY, X-Content-Type-Options: nosniff, X-XSS-Protection: 1; mode=block, Content-Type: text/html;charset=UTF-8, Content-Length: 1445, Дата: вторник, 06 декабря 2016 г., 11:52:39 по Гринвичу, сервер: WSO2 Carbon Server]

а также распечатка стека

Unexpected character (<) at position 0.
at org.json.simple.parser.Yylex.yylex(Yylex.java:610)
at org.json.simple.parser.JSONParser.nextToken(JSONParser.java:269)
at org.json.simple.parser.JSONParser.parse(JSONParser.java:118)
at org.json.simple.parser.JSONParser.parse(JSONParser.java:92)
at com.gubnoi.user.provision.Scim.createUser(Scim.java:52)
at com.gubnoi.gate.Gate.lambda$signin$0(Gate.java:131)
at io.reactivex.internal.operators.observable.ObservableScalarXMap$ScalarXMapObservable.subscribeActual(ObservableScalarXMap.java:141)

кажется, что тело сообщения начинается с «‹». который вызвал исключение во время синтаксического анализа JSON.

у кого-нибудь есть идеи? или комментарии? или предложение?

Спасибо


person George Wang    schedule 06.12.2016    source источник
comment
Похоже, произошла ошибка, и вы получаете сообщение об ошибке в text/html. 1) Посмотреть есть ли какие логи в логах ИС. 2) Распечатать входящее сообщение без разбора в json и посмотреть, что в нем.   -  person Bee    schedule 07.12.2016


Ответы (1)


это оказалось ложной тревогой.

проблема связана со значением конечной точки (scimUrl), которое было установлено как «https://xxx.xxx.xxx:9443/wso2/scim".

Я изменил его на "https://xxx.xxx.xxx:9443/wso2/scim/Users", то все работает нормально.

ваше здоровье

person George Wang    schedule 07.12.2016