尝试访问 REST API 时出现 401(未授权)

Posted

技术标签:

【中文标题】尝试访问 REST API 时出现 401(未授权)【英文标题】:401 (Unauthorized) when trying to access REST API 【发布时间】:2015-06-30 21:32:40 【问题描述】:

所以基本上,我正在尝试在线连接到 REST API。够简单吧?

但是,每当我尝试连接时,都会收到 401(未经授权)错误。我正在使用 C# 控制台应用程序对此进行测试,并且我还尝试使用 PUTMAN(Google Chrome 应用程序来查看 HTTP 请求)。

这是我正在使用的 API 的链接:https://community.dynatrace.com/community/display/APMSAASDOC/Login+-+REST+API

我遵循列出的所有步骤。我知道我的用户名和密码正确(已登录 Dynatrace 门户)。有谁知道可能出了什么问题?下面是我的代码(出于显而易见的原因,我删除了实际的用户名和密码):

static async Task RunAsync()
    
        string _user;
        string _password;
        string _authorizationType;
        string _contentType;
        string _CredentialsToBase64;
        string _url = "https://datafeed-api.dynatrace.com";

        _user = "MYUSERNAME";
        _password = "MYPASSWORD";
        _authorizationType = "basic";
        _contentType = "application/json";
        _CredentialsToBase64 = System.Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(_user + ":" + _password));


        using (var client = new HttpClient())
        
            client.BaseAddress = new Uri(_url);
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(_contentType));
            client.DefaultRequestHeaders.Add("Authorization", _authorizationType + " " + _CredentialsToBase64);

            using (HttpResponseMessage httpResponse = await client.GetAsync("publicapi/rest/v1.0/login?user=MYUSERNAME&password=MYPASSWORD HTTP/1.1"))
            
                if (httpResponse.IsSuccessStatusCode)
                
                    Console.WriteLine("Success");
                
                else
                
                    Console.WriteLine(string.Format("Service request failed (0)", httpResponse.StatusCode));
                
            



        

【问题讨论】:

如果您传递授权标头,为什么要在 URL 中包含用户名/密码。 你为什么要传递Authorization 标头? 我从另一个团队成员那里得到了这段代码;我试过注释掉 Authorization 标头,我猜这没有什么区别。 【参考方案1】:

client.GetAsync 方法调用末尾的HTTP/1.1 字符串可能被转换为password=MYPASSWORD%20HTTP/1.1(或类似的),从而导致错误。尝试删除它,看看它是否有效。

注意:%20是一个urlencoded空格

另一个选项this post 的答案可能是相关的。总而言之,格式化请求似乎需要 BaseAddress 有一个尾部斜杠,并且 GetAsync 字符串不以斜杠开头。

【讨论】:

不幸的是它不起作用:/我之前认为这也可能是问题,但它没有任何区别。【参考方案2】:

很抱歉让大家头疼。问题是公司本身的帐户问题。我联系了他们,他们注意到问题在于帐户从旧门户迁移到新门户。所以我们的结局没有错。感谢大家的帮助!

【讨论】:

【参考方案3】:

从 GET url 的末尾删除“HTTP/1.1”,将其添加到密码的末尾,因此是 401

【讨论】:

以上是关于尝试访问 REST API 时出现 401(未授权)的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 REST API 公开对象时出现“拒绝访问。提供的范围未经授权”错误

在 grails 应用程序中调用 spring security rest 插件登录时出现 401 未经授权的错误

将 API 迁移到 .net Core 3 时出现 JWT 401 未经授权的错误

Github 操作,使用 npm 或 yarn 安装 Github 包时出现 401 未授权

针对 REST API 的授权引发错误:401(未找到请求的凭据。)

PayPal Rest API 在切换到 Live Credentials 时出现 401 错误