私はサーバー上で動作するアプリケーションを持っています。ユーザーがサーバーに接続しようとすると、GET要求が送信されます。要求で渡されたユーザー名とパスワードに基づいて、サーバーはユーザーを認証します。java/androidを使ったBase64デコード/エンコーディング
javaで書かれたクライアントコードを使用してサーバーに接続できます。リクエストがサーバに到着し、それは私が次の出力を受け取り、それを処理するとき
private String GETrequest(String nMountpoint, String nUsername, String nPassword){
String requestmsg = "";
requestmsg += "GET /" + nMountpoint + " HTTP/1.0\r\n";
requestmsg += "Host: " + nServer +"\r\n";
requestmsg += "User-Agent: NTRIP Client v1\r\n";
requestmsg += "Ntrip-Version: Ntrip/2.0\r\n";
requestmsg += "Accept: */* \r\n";
requestmsg += "Connection: close\r\n";
if (nUsername.length() > 0) {
requestmsg += "Authorization: Basic " + Base64.getEncoder().encodeToString((nUsername + ":" + nPassword).getBytes(StandardCharsets.UTF_8)) + "\r\n\r\n";
}
return requestmsg;
}
::私は、GET要求を生成するために使用するコードがある
GET /mP HTTP/1.0
Host: host.address.net
User-Agent: NTRIP Client v1
Ntrip-Version: Ntrip/2.0
Accept: */*
Connection: close
Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M=
checking credentials
dGVzdHVzZXI6dGVzdHBhc3M=
lavrovson:exotech
User: testuser, Pass: testpass
予定とサーバーはメッセージをデコードし、プロセスは実行され続けます。 しかし、私はアンドロイドのアプリケーションを使用してサーバーに接続しようとすると、サーバー側のプロセスがスタック。 私はAndroid上でGET要求を生成するために使用するコードは次のとおりです。
private String GETrequest(String nMountpoint, String nUsername, String nPassword){
String requestmsg = "";
requestmsg += "GET /" + nMountpoint + " HTTP/1.0\r\n";
requestmsg += "Host: " + nServer +"\r\n";
requestmsg += "User-Agent: NTRIP Client v1\r\n";
requestmsg += "Ntrip-Version: Ntrip/2.0\r\n";
requestmsg += "Accept: */* \r\n";
requestmsg += "Connection: close\r\n";
if (nUsername.length() > 0) {
String usps = nUsername + ":" + nPassword;
byte[] bt = null;
try {
bt = usps.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {e.printStackTrace();}
String base64 = Base64.encodeToString(bt, Base64.DEFAULT);
requestmsg += "Authorization: Basic " + base64 + "\r\n\r\n";
}
return requestmsg;
}
要求がサーバに到着し、それは私が次の出力受け、それを解読しようとすると:
GET /mP HTTP/1.0
Host: host.address.net
User-Agent: NTRIP Client v1
Ntrip-Version: Ntrip/2.0
Accept: */*
Connection: close
Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3M=
checking credentials
dGVzdHVzZXI6dGVzdHBhc3M=
プロセスを取得しBase64でエンコードされた文字列のデコードに固執します。 私は次のコードを使用して、サーバー上でエンコードされた文字列をデコードしようとしている:
byte[] valueDecoded = Base64.getDecoder().decode(decodedString);
String UserPass = new String(valueDecoded, StandardCharsets.UTF_8);
String[] UP = UserPass.split(":");
EDIT: いくつかの追加のサーバコード:
private void messageParsing(byte[] bt){
String MSG = new String(bt);
if (bt.length > 4){
System.out.println(MSG);
}
String tokens[] = MSG.split(" ");
// GET request parsing
if (tokens[0].matches("GET") && tokens[1].length()>1){
if (secure){
if(conn_logger.isTraceEnabled()){
conn_logger.trace("Client at adress " + secureSocket.getRemoteSocketAddress());
}
} else {
if(conn_logger.isTraceEnabled()){
conn_logger.trace("Client at adress " + socket.getRemoteSocketAddress());
}
}
System.out.println("checking credentials");
chekCredentials(tokens);
}
}
checkCredentials
方法:
private void chekCredentials(String[] tokens){
String[] encoded = tokens[tokens.length-1].split("\r\n");
System.out.println(encoded[0]);
byte[] valueDecoded = Base64.getDecoder().decode(encoded[0]);
System.out.println(new String(valueDecoded));
String UserPass = new String(valueDecoded, StandardCharsets.UTF_8);
String[] UP = UserPass.split(":");
System.out.println("User: " + UP[0] + ", Pass: " + UP[1]);
// Some stuff to do with user/password
.
.
.
}
なぜ、サーバーコードではbasをデコードできないのでしょうか?アンドロイドアプリから来ているe64エンコードされた文字列ですか? Android側のエンコード処理に問題がありますか? ご協力いただければ幸いです。ありがとうございました。
両方の要求からの出力が正確であれば、アンドロイドクライアントが追加を送っているようですサーバー側でメッセージの処理に問題が発生している可能性があります。実際に何が行われているかを確認するためにサーバーコードを投稿できますか? – Guenther
さらにコードを追加しました。 – Dan
@Maddy私はまだ試していないことは何もありません。すべての私の輸入は、彼らがすべきやり方であり、私は様々な答えで示唆されているものと同じことをやっています。 – Dan