2017-09-27 16 views
0

私はサーバー上で動作するアプリケーションを持っています。ユーザーがサーバーに接続しようとすると、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側のエンコード処理に問題がありますか? ご協力いただければ幸いです。ありがとうございました。

+0

両方の要求からの出力が正確であれば、アンドロイドクライアントが追加を送っているようですサーバー側でメッセージの処理に問題が発生している可能性があります。実際に何が行われているかを確認するためにサーバーコードを投稿できますか? – Guenther

+0

さらにコードを追加しました。 – Dan

+0

@Maddy私はまだ試していないことは何もありません。すべての私の輸入は、彼らがすべきやり方であり、私は様々な答えで示唆されているものと同じことをやっています。 – Dan

答えて

0

直接文字列引数として「UTF-8」を使用する代わりに、Androidの文字列からgetBytesを実行する際にStandardCharsets.UTF_8を使用するか、下位APIレベルを指している場合は以下のように使用します。

代わりの

bt = usps.getBytes("UTF-8"); 

使用解かこの

bt = usps.getBytes(Charset.forName("UTF-8")) 
+0

'bt = usps.getBytes(Charset.forName(" UTF-8 "))'を使用するようにコードを変更しました。その結果、デコード時に同じサーバーが停止します。 – Dan

0

問題。どうやら行で :。 requestmsg += "Authorization: Basic " + base64 + "\r\n\r\n" Androidは `の\ r \ nを\ r \ nの」前\n追加を追加して

関連する問題