如何通过.Net向Azure Databricks进行身份验证?

时间:2018-08-09 20:46:28

标签: c# azure databricks

我试图弄清楚如何向我的应用程序发送HTTP请求到Azure Databricks。目前,我只能进行身份验证;每个请求都会返回401未经授权错误。

我已按照他们的指南进行操作,并创建了个人访问令牌并检索了其密钥。这是我的代码,它将发送创建集群的请求:

var values = new Dictionary<string, string>
        {
           { "cluster_name", "hello" },
           { "spark_version", "4.0.x-scala2.11" },
            {"machine","eastus2" },//,
            {"login","token" },
            {"password", "dapi75dcd6e05815ae7bc52cc873b1b0f55c" }
        };

        var content = new FormUrlEncodedContent(values);
        Debug.WriteLine("started");
        var response = client.PostAsync("https://eastus2.azuredatabricks.net/api/2.0/clusters/get", content).Result;

        var responseString = response.Content.ReadAsStringAsync().Result;

        Debug.WriteLine(responseString);

但是这一直失败,我怀疑用户名和密码的密钥名错误,但是我不知道如何找出正确的标签。

感谢您的帮助!

编辑:这是返回的内容

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/>
<title>Error 401 </title>
</head>
<body>
<h2>HTTP ERROR: 401</h2>
<p>Problem accessing /api/2.0/clusters/get. Reason:
<pre>    Unauthorized</pre></p>
<hr />
</body>
</html>

1 个答案:

答案 0 :(得分:0)

根据Azure Databricks Rest API sample,我们知道我们需要请求授权标头Authorization: Basic base64codestring

  

从上面获得的令牌需要转换为Base64编码的字符串。需要注意的重要一点是,您必须也要添加前缀“ 令牌:”。因此,要编码的完整字符串类似于“ token:dapi56b ........... d5”

我们可以从create clusters API

获得尸体
{
  "cluster_name": "my-cluster",
  "spark_version": "4.0.x-scala2.11",
  "node_type_id": "Standard_D3_v2",
  "spark_conf": {
    "spark.speculation": true
  },
  "num_workers": 25
}

以下是我的测试演示代码:

var url = "https://eastasia.xxxxxxx.net/api/2.0/clusters/create";
HttpClient client = new HttpClient();
var token = "token:dapi.......";
var body ="{\"cluster_name\": \"my-cluster\",\"spark_version\": \"4.0.x-scala2.11\",\"node_type_id\": \"Standard_D3_v2\",\"spark_conf\": { \"spark.speculation\": true},\"num_workers\": 25}"
client.DefaultRequestHeaders.Add("Authorization", "Basic "+ Base64Encode(token));
HttpContent content = new StringContent(body);
var response = client.PostAsync(url, content).Result;
Console.WriteLine(response.Content.ReadAsStringAsync().Result);
Console.ReadKey();

测试结果

enter image description here

已更新:

添加Base64Encode功能代码。

private static string Base64Encode(string plainText)
        {
            var plainTextBytes = Encoding.UTF8.GetBytes(plainText);
            return Convert.ToBase64String(plainTextBytes);
        }