私は 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 解析中に例外をトリガーしました。
誰にもアイデアはありますか?またはコメントはありますか?または提案?
ありがとう