2014-09-24 24 views
1

我使用來自開源項目的TokenHttpRequest類:Moodle的 - 試圖得到令牌,接收故宮403

public String doHTTPRequest(String url){ 
     String responseBody = ""; 
     String token = ""; 

     DefaultHttpClient httpClient = new DefaultHttpClient(); 

     // Creating HTTP Post 
     HttpGet httpPost = new HttpGet(url); 

     try { 
      ResponseHandler<String> responseHandler=new BasicResponseHandler(); 
      HttpContext context = new BasicHttpContext();    context.setAttribute(CoreProtocolPNames.USER_AGENT, "Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0"); 
      responseBody = httpClient.execute(httpPost, responseHandler, context); 

      JSONObject jObject = new JSONObject(responseBody); 
      token = jObject.getString("token"); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace();    
     } catch (ClientProtocolException e) { 
      // writing exception to log 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // writing exception to log 
      e.printStackTrace();  
     } 

     return token; 
    } 

它運作良好,直到Moodle站點不能訪問即時更新到2.7。 現在httpClient.execute行給出了錯誤禁止403。在瀏覽器中,url正常工作。

這就是我得到:

09-24 17:42:58.246: W/System.err(8820): org.apache.http.client.HttpResponseException: Forbidden 
09-24 17:42:58.246: W/System.err(8820):  at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:71) 
09-24 17:42:58.246: W/System.err(8820):  at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:59) 
09-24 17:42:58.246: W/System.err(8820):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:657) 
09-24 17:42:58.246: W/System.err(8820):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:627) 
09-24 17:42:58.246: W/System.err(8820):  at moodle.android.moodle.helpers.TokenHttpRequest.doHTTPRequest(TokenHttpRequest.java:86) 
09-24 17:42:58.246: W/System.err(8820):  at ro.example.app.Login$2.run(Login.java:170) 
09-24 17:42:58.246: W/System.err(8820):  at java.lang.Thread.run(Thread.java:841) 

也:

09-24 17:13:51.986: I/entity(2975): <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> 
09-24 17:13:51.986: I/entity(2975): <html><head> 
09-24 17:13:51.986: I/entity(2975): <title>403 Forbidden</title> 
09-24 17:13:51.986: I/entity(2975): </head><body> 
09-24 17:13:51.986: I/entity(2975): <h1>Forbidden</h1> 
09-24 17:13:51.986: I/entity(2975): <p>You don't have permission to access /login/token.php 
09-24 17:13:51.986: I/entity(2975): on this server.</p> 
09-24 17:13:51.986: I/entity(2975): </body></html> 

當我試圖讓使用EntityUtils

任何實體有這個問題?

回答

2

第一次設置這是一個真正的痛苦,但有一些步驟可能會幫助你找出答案。

  1. 首先,有上Moodle的一個已知的bug,當你在網絡上創建一個外部服務,它不能正確地對數據庫創建短名稱。您可以通過訪問數據庫,轉到表external_services並手動添加您在請求中使用的短名稱來修復它。

  2. 爲組啓用權限。這可能是您的問題,並解決您需要進入用戶>權限>定義角色。一旦編輯了其中一個角色,使其能夠創建令牌並訪問REST協議。 (我通常允許爲移動設備創建令牌並創建令牌)

  3. 在執行最後一步之後,請務必將此角色分配給您嘗試訪問的用戶,然後指定系統中的角色並單擊該角色。

  4. 最後,如果所有這些都不起作用,請嘗試搜索任何可能的複選框的全部設置,以說明有關WebService的任何內容! :)

希望能幫助你和像我這樣的人,整整一週陷入困境!

+0

我已經檢查過,並且在external_services表中有短名稱;所有經過身份驗證的用戶都可以創建Web服務令牌並訪問REST API。所以我不知道除了可能的數據庫錯誤之外有什麼不對。 – 2016-12-09 13:45:35

+1

你知道服務器響應你的請求的消息是什麼嗎? – Thpramos 2016-12-14 17:36:55

+0

我不能複製它,以便能夠在這裏複製和粘貼它,但有一個問題是它將一些消息作爲對象而不是字符串返回,但是即使使用JSON.stringify也沒有特別照亮。我們認爲這可能是導致問題的Moodle服務器的新安全設置。 – 2016-12-16 11:49:50