2017-12-31 286 views
0

Android 앱에 토큰 화를 구현하려고하는데이를 위해 서버에 연결할 때마다 인증 헤더를 항상 요청에 추가해야합니다. 문제는 내가 서버 인스턴스를 디버깅 할 때, 요청이 이루어진 경우에도, 거기에 추가 권한 부여 헤더 (auth_token_string가 null의 경우Android Volley : 헤더가 추가되지 않았습니다.

여기

가 이미 확인 내 코드

private void syncDatabases() 
{ 
    String tag_json_obj = "json_obj_req"; 
    String uri = "random_url"; 
    final ProgressDialog pDialog = new ProgressDialog(this); 
    pDialog.setMessage("Please wait while syncing"); 
    pDialog.show(); 

    List<Plane> allPlane = service.gettAllPlane(); 
    Gson gson = new Gson(); 
    JSONArray jsArray = new JSONArray(); 

    for (Plane p : allPlane) 
    { 
     String jsonString = gson.toJson(p); 
     try { 
      JSONObject obj = new JSONObject(jsonString); 
      obj.remove("ID"); 
      jsArray.put(obj); 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 

    JsonArrayRequest jsonObjReq = new JsonArrayRequest(Request.Method.POST, uri, jsArray, new Response.Listener<JSONArray>() 
    { 
     @Override 
     public void onResponse(JSONArray response) 
     { 
      ArrayList<Plane> newList = new ArrayList<>(); 
      try 
      { 
       for(int i=0;i<response.length();i++) 
       { 
        String planeName,planeEngine,planeProducer,planeCountry,planeYear,wikiLink,ID; 
        JSONObject pl = response.getJSONObject(i); 

        String p1 = pl.optString("ID"); 
        if (pl != null && !p1.isEmpty()) 
         ID = pl.getString("ID"); 
        else 
         ID = "0"; 

        String p2 = pl.optString("planeName"); 
        if (p2 != null && !p2.isEmpty()) 
         planeName = pl.getString("planeName"); 
        else 
         planeName = ""; 

        String p3 = pl.optString("planeEngine"); 
        if (p3 != null && !p3.isEmpty()) 
         planeEngine = pl.getString("planeEngine"); 
        else 
         planeEngine = ""; 

        String p4 = pl.optString("planeProducer"); 
        if (p4 != null && !p4.isEmpty()) 
         planeProducer = pl.getString("planeProducer"); 
        else 
         planeProducer = ""; 

        String p5 = pl.optString("planeCountry"); 
        if (p5 != null && !p5.isEmpty()) 
         planeCountry = pl.getString("planeCountry"); 
        else 
         planeCountry = ""; 

        String p6 = pl.optString("planeYear"); 
        if (p6 != null && !p6.isEmpty()) 
         planeYear = pl.getString("planeYear"); 
        else 
         planeYear = "0"; 

        String p7 = pl.optString("wikiLink"); 
        if (p7 != null && !p7.isEmpty()) 
         wikiLink = pl.getString("wikiLink"); 
        else 
         wikiLink = ""; 

        Plane plf = new Plane(Integer.parseInt(ID),planeName,planeEngine,planeProducer,planeCountry,Integer.parseInt(planeYear),wikiLink); 
        newList.add(plf); 
       } 
      } 
      catch (JSONException e) 
      { 
       e.printStackTrace(); 
      } 

      service.deleteAllFromPlane(); 
      for (Plane p : newList) 
      { 
       boolean ok = service.addNewPlane(p); 
      } 
      pDialog.dismiss(); 
      tab1.onIorU(); 

     } 

    }, new Response.ErrorListener() 
    { 
     @Override 
     public void onErrorResponse(VolleyError error) 
     { 
      Log.e("ERROR", "Error occurred ", error); 
      pDialog.dismiss(); 
     } 
    }) 
    { 
     @Override 
     public Map<String, String> getHeaders() throws AuthFailureError 
     { 
      SharedPreferences settings = PreferenceManager 
        .getDefaultSharedPreferences(MainActivity.this); 
      String auth_token_string = settings.getString("token", ""); 

      Map<String, String> params = new HashMap<>(); 
      params.put("Content-Type", "application/json; charset=UTF-8"); 
      params.put("Authorization", auth_token_string); 
      return params; 
     } 
    }; 

이라고 없다는 것입니다 그렇지 않다). 저는 여기에 서버 측 (C# 웹 API 2 서버)에 표시되는 내용 여기 enter image description here

그리고 내가 헤더 얻는 방법이다 : 당신이 토큰의 일부를 볼 수 있습니다

var authorization = request.Headers.Authorization; 

은 PIC에서를 I 헤더 필드를 보내보십시오. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 고맙습니다.

+0

'getHeaders()'메서드를 참조하십시오. 그러나 결코 호출되지 않습니다. 헤더는 어디에 부착합니까? – Doomsknight

+0

자동 호출됩니다 (거기에 중단 점을 추가하면 자동으로 트리거됩니다). 또한 토큰이 헤더 섹션에 게시 된 사진에 어떻게 든 추가되었다는 것을 볼 수 있습니다. – Artyomska

+0

요청의 값을 하드 코딩 해보십시오. 이렇게하면 ui에서 문자열을 가져올 수 있는지 여부를 판단하는 데 도움이됩니다. 코드가 올바르게 보입니다. params.put ("Content-Type", "application/json; charset = UTF-8")을 제거한 후에도 시도해보십시오. – Sree

답변

1

승인 토큰에 누락 된 권한 유형입니다. 나는 당신이 Bacis auth를 사용하고 있음을 asuming하고 있으므로 다음을 사용하여 이것을 시도하십시오 :

params.put("Authorization", "Basic " + auth_token_string); 
+0

그게 문제였습니다. 고맙습니다 :) – Artyomska