2017-09-14 10 views
0

私はOAuth2ベアラートークンをPost要求とともにサーバー(Google Apps Script Execution 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; 
    } 
} 

実際のDataオブジェクトにヘッダーを設定しようとしましたが、そこに運がありませんでした。

答えて

0

UploadHandleにUploadHandleRawを変更し、単一のポストに設定要求を、UTF8にenconding試してみてください。

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スクリプトからのエラーメッセージは、認証トークンの送信中に誤解を招くことがあります。私はスクリプトから認証トークン(Execution APIエンドポイントを提供しています)を生成し、そのトークンをアプリでハードコーディングすることで正確性をテストすることができました。そうすることで、リクエストが成功しました。

スクリプトと私のアプリで使用されているクラウドプロジェクトは同じですが、まだエラーが表示されていることを確認しましたが、それは別の質問のために問題です:)。

+0

この完全な円にする。私は最終的に、私がauthトークンを生成するときにスクリプトで必要なスコープを使用していることを確認することで、良いAuthトークンを生成することができました(ドライブの全範囲が必要なときにDrive.fileスコープを使用していました。 – t3jem

関連する問題