2017-09-14 176 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