2017-09-14 122 views
0

我試圖將OAuth2載體令牌和Post請求一起傳遞給我的服務器(使用Google Apps腳本執行API)。我試圖設置授權令牌的方式不斷收到401未經授權的錯誤。我確信我會以某種方式設置它,但我一直無法弄清楚什麼是錯的。未通過UnityWebRequest傳遞授權標頭

下面是我目前的代碼。

private static UnityWebRequest createRequest(string functionName, List<string> parameters) 
{ 
    PostData data = new PostData(); 
    data.Add("function", functionName); 
    data.Add("parameters", string.Join(",", parameters.ToArray())); 
    data.Add("devMode", "true"); // TODO: remove before launch 

    Debug.Log(data.toJsonString()); 
    UnityWebRequest request = new UnityWebRequest(
      "https://script.googleapis.com/v1/scripts/" + SERVER_SCRIPT_ID + ":run", 
      UnityWebRequest.kHttpVerbPOST); 
    UploadHandlerRaw uploadHandler = new UploadHandlerRaw(data.toJsonBytes()); 
    request.uploadHandler = uploadHandler; 
    request.downloadHandler = new DownloadHandlerBuffer(); 
    request.SetRequestHeader("Content-Type", "application/json; charset=utf-8"); 
    request.SetRequestHeader("Authorization", "Bearer " + DriveAPI.getInstance().getAuthToken()); 

    yield return request.Send(); 
    Debug.Log(request.downloadHandler.text); 
} 

[Serializable] 
private class PostData : Dictionary<string, string> 
{ 
    public byte[] toJsonBytes() 
    { 
     return Encoding.ASCII.GetBytes(toJsonString()); 
    } 
    public string toJsonString() 
    { 
     string result = "{"; 
     foreach (string key in this.Keys) 
     { 
      string value; 
      TryGetValue(key, out value); 
      result += "\"" + key + "\":\"" + value + "\","; 
     } 
     result = result.Substring(0, result.Length - 1) + "}"; 
     return result; 
    } 
} 

我已經嘗試在實際的數據對象中設置標題,但沒有運氣那裏要麼。

回答

0

儘量enconding爲UTF8,改變UploadHandleRaw到UploadHandle和設置要求單個帖子:

private static UnityWebRequest createRequest(string functionName, List<string> parameters) 
{ 
    PostData data = new PostData(); 
    data.Add("function", functionName); 
    data.Add("parameters", string.Join(",", parameters.ToArray())); 
    data.Add("devMode", "true"); // TODO: remove before launch 

    Debug.Log(data.toJsonString()); 
    UnityWebRequest request = new UnityWebRequest("https://script.googleapis.com/v1/scripts/" + SERVER_SCRIPT_ID + ":run", "POST"); 
    UploadHandler uploadHandler =(UploadHandler) new UploadHandlerRaw(Encoding.UTF8.GetBytes(data.toJsonString())); 
    request.uploadHandler = uploadHandler; 
    request.downloadHandler = new DownloadHandlerBuffer(); 
    request.SetRequestHeader("Content-Type", "application/json"); 
    request.SetRequestHeader("Authorization", "Bearer " + DriveAPI.getInstance().getAuthToken()); 

    yield return request.Send(); 

    if (www.error != null) 
    { 
     Debug.Log("Error: " + www.error); 
    } 
    else 
    { 
     Debug.Log("Status Code: " + request.responseCode); 
    } 

} 
+0

不幸的是沒有運氣。經過一些更多的調試後,我發現這是auth令牌本身而不是請求的問題(錯誤消息非常具有誤導性)。從我的腳本生成驗證令牌並將其硬編碼到請求中會導致請求成功。所以我的問題是生成驗證碼而不是請求本身。 (我確實確保我使用的是同一個雲計劃,所以我仍在調查此問題)。 – t3jem

0

原來我的代碼是工作的罰款。

來自Apps腳本的錯誤消息在發送Auth令牌時會產生誤導。我能夠通過從我的腳本(即服務於Execution API端點)中生成一個auth令牌並在我的應用程序中對該令牌進行硬編碼來測試正確性。這樣做導致了一個成功的請求。

我已檢查腳本中使用的雲項目和我的應用程序是相同的,但仍然收到錯誤,但這是另一個問題的問題:)。

+0

帶來這個完整的圈子。我終於能夠通過確保在生成我的身份驗證令牌時使用腳本所需的作用域(當我需要全驅動器作用域並且不包括腳本屬性時使用Drive.file作用域),來生成良好的Auth令牌。 – t3jem