【问题标题】:Oauth 2.0 RestSharp passing accesstokenOauth 2.0 RestSharp 传递访问令牌
【发布时间】:2021-04-22 23:34:18
【问题描述】:

继上一个问题之后,我取得了一些进展,但仍然卡住了

我可以在测试类中使用这个SetUp方法获取accessToken

但是当我尝试运行测试 CanGetAllCountries 时,它仍然说它是未经授权的

如何通过accessToken授权第二次测试?

public class APITestCustomer
{
    public static string baseUrl = "https://www.example.net/umbraco/api/";
    

[SetUp]
public void OAuthLogonSetup()
{

    var client = new RestClient(baseUrl);
    RestRequest request = new RestRequest("UsersApi/Logon") { Method = Method.POST };
    request.AddHeader("Accept", "application/json");
    request.AddHeader("Content-type", "application/x-www-form-urlencoded");
    request.AddParameter("Username", "xxxxxx");
    request.AddParameter("Password", "xxxxxx");
    request.AddParameter("grant_type", "client_credentials");

    var response = client.Execute(request);
    var responseJson = response.Content;
    var token = JsonConvert.DeserializeObject<Dictionary<string, object>>(responseJson)["accessToken"].ToString();

    //Assert.That(token.Contains("test"));

}


        [Test]
        public void CanGetAllCountries()
        {
            
            RestClient client = new RestClient(baseUrl);
            RestRequest request = new RestRequest("CountryApi/GetAll", Method.GET);
            request.AddHeader("Authorization", "Bearer");
            IRestResponse response = client.Execute(request);
            Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
        }

    }
}

【问题讨论】:

  • 只需像保存 url 一样保存令牌,不是静态的,而是类属性。或者只是将令牌作为 OAuthLogonSetup() 方法的结果返回:) 同样在 AddHeader 上,您应该添加与 Bearer: $"Bearer {token}" 连接的令牌字符串,例如。
  • @JesúsNarváez 谢谢你的回复,我想我已经试过了,你能举个例子吗?再次感谢。
  • client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", ACCESS_TOKEN);检查:docs.microsoft.com/en-us/dotnet/api/…
  • @JesúsNarváez 谢谢,也许我今天过得很糟糕,但你能告诉我我会把它放在哪里吗:D 谢谢

标签: c# oauth-2.0 restsharp web-api-testing umbraco8


【解决方案1】:

为了达到这个目的,您可以对您的代码进行以下修改:

public class APITestCustomer
{
    public static string baseUrl = "https://www.example.net/umbraco/api/";
    private string token;
    

[SetUp]
public void OAuthLogonSetup()
{

    var client = new RestClient(baseUrl);
    RestRequest request = new RestRequest("UsersApi/Logon") { Method = Method.POST };
    request.AddHeader("Accept", "application/json");
    request.AddHeader("Content-type", "application/x-www-form-urlencoded");
    request.AddParameter("Username", "xxxxxx");
    request.AddParameter("Password", "xxxxxx");
    request.AddParameter("grant_type", "client_credentials");

    var response = client.Execute(request);
    var responseJson = response.Content;
    token = JsonConvert.DeserializeObject<Dictionary<string, object>>(responseJson)["accessToken"].ToString();

    //Assert.That(token.Contains("test"));

}


        [Test]
        public void CanGetAllCountries()
        {
            
            RestClient client = new RestClient(baseUrl);
            RestRequest request = new RestRequest("CountryApi/GetAll", Method.GET);
            request.AddHeader("Authorization", $"Bearer {token}");
            IRestResponse response = client.Execute(request);
            Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
        }

    }
}

【讨论】:

  • 再次感谢,但我现在得到'休息请求不包含'标题'的定义
  • @Steven983 然后你可以试试这个代码:request.AddHeader("Authorization", $"Bearer {token}");
  • 现在正在运行,非常感谢您抽出宝贵时间。