0

私は WSO2is-5.2.0 SCIM インターフェイスで作業していて、奇妙な問題に遭遇しました。

これはモバイル アプリケーション プロジェクトであり、ID 管理として WSO2 IS を使用することにしました。顧客のサインアップは、WSO2 IS の SCIM インターフェイスを介して行われます。

モバイル デバイスで、コンテンツ タイプ = application/json の Restful ポスト メッセージを介してユーザー名とパスワードを入力して送信します (以下の 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 IS との互換性を確保するために wso2 Charon コード セットを使用しました。

ゲートで、このリクエストは傍受され、「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; モード = ブロック、コンテンツ タイプ: テキスト/html;文字セット = UTF-8、コンテンツの長さ: 1445、日付: 2016 年 12 月 6 日 11:52:39 GMT、サーバー: WSO2 カーボン サーバー]

また、スタックのプリントアウト

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 解析中に例外をトリガーしました。

誰にもアイデアはありますか?またはコメントはありますか?または提案?

ありがとう

4

1 に答える 1

0

これは誤警報であることが判明しました。

問題は、「 https://xxx.xxx.xxx:9443/wso2/scim 」として設定されていたエンドポイント値 (scimUrl) にあります。

「 https://xxx.xxx.xxx:9443/wso2/scim/Users 」に変更すると、正常に動作します。

乾杯

于 2016-12-07T07:36:41.080 に答える