Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在RestSharp中使用OAuth2_C#_Rest_Curl_Oauth 2.0_Restsharp - Fatal编程技术网

C# 如何在RestSharp中使用OAuth2

C# 如何在RestSharp中使用OAuth2,c#,rest,curl,oauth-2.0,restsharp,C#,Rest,Curl,Oauth 2.0,Restsharp,在服务器端(SpringJava)整理OAuth2几天后,我开始使用C#编写的客户机。我正在使用RestSharp调用我的web API,但我在使用OAuth2时遇到了真正的困难。几乎没有任何文档,我在网上找到的几个例子也不起作用。有人能提供我一个最新的代码样本,我可以使用吗 到目前为止,我有以下几点: var client = new RestClient("http://example.com/myapi/oauth/token"); RestRequest request = new Re

在服务器端(SpringJava)整理OAuth2几天后,我开始使用C#编写的客户机。我正在使用RestSharp调用我的web API,但我在使用OAuth2时遇到了真正的困难。几乎没有任何文档,我在网上找到的几个例子也不起作用。有人能提供我一个最新的代码样本,我可以使用吗

到目前为止,我有以下几点:

var client = new RestClient("http://example.com/myapi/oauth/token");
RestRequest request = new RestRequest() { Method = Method.POST };

request.AddHeader("Content-Type", "application/json");
request.AddParameter("grant_type", "client_credentials");
request.AddParameter("client_id", "client-app");
request.AddParameter("client_secret", "secret");

var response = client.Execute(request);
我只是在调试模式下运行这段代码,当我查看响应时,我得到了未授权

当我使用相同的参数在控制台上执行curl时,它工作得很好,但似乎我无法使它在C#中工作。下面是curl命令:

curl -H "Accept: application/json" client-app:secret@example.com/myapi/oauth/token -d grant_type=client_credentials
顺便说一下,我已经用占位符替换了真实的API URL和其他信息。

请参见

以下是请求的基本格式

POST/token HTTP/1.1
主机:server.example.com
授权:基本CZCAGRSA3F0MZPNWDFMQMF0M2JW
内容类型:application/x-www-form-urlencoded
授予\类型=客户端\凭据
你的卷发请求

curl-H“接受:应用程序/json”\
-d grant\u type=客户端\u凭据\
客户端应用程序:secret@example.com/myapi/oauth/token
cURL命令工作的原因

  • 带有POST(使用
    -d
    开关时的默认设置)的默认
    内容类型是
    application/x-www-form-urlencoded
  • 默认身份验证类型(如果未指定)为。用户名和密码通过
    -u
    选项或URL传递

    -u用户名:密码(客户端应用程序:机密)
    --或者把它放在url中--
    客户端应用程序:secret@example.com/myapi/oauth/token
    
    您还可以使用
    --basic
    --digest

  • 您可以在cURL命令中使用
    -v
    开关查看请求中涉及的所有头

    RestSharp修复:

  • 内容类型设置为
    应用程序/x-www-form-urlencoded

  • 添加基本身份验证

    client.Authenticator = new HttpBasicAuthenticator("client-app", "secret");
    
  • 除掉

    request.AddParameter("client_id", "client-app");
    request.AddParameter("client_secret", "secret");
    
  • Accept
    标题设置为
    application/json


  • 我能够使以下两个函数都工作

     public RestClient getClient2(string user, string token)
        {
            RestClient client = new RestClient();
            client.BaseUrl = new Uri(baseUrl);
            client.Authenticator = new HttpBasicAuthenticator(user, token);                
            //client.Authenticator = new OAuth2UriQueryParameterAuthenticator(token); //works
            //client.Authenticator = new OAuth2AuthorizationRequestHeaderAuthenticator(token); // doesn't work
    
            return client;
        }
    
      public GitHubUser GetGitHubUser2()
        {
            RestRequest request = new RestRequest();        
            request.Resource = "/users/huj";
            request.RootElement = "GitHubUser";
    
            RestClient client = getClient2(myUser, myToken);
    
            return Execute<GitHubUser>(client, request);        
        }
    
    
        /// <summary>
        /// http://stackoverflow.com/questions/30133937/how-to-use-oauth2-in-restsharp
        /// </summary>
        /// <returns>GitHubUser</returns>
        public GitHubUser GetGitHubUser3()
        {
            //RestRequest request = new RestRequest(Method.POST);  //empty data
            RestRequest request = new RestRequest();
            request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
            request.AddHeader("Accept", "application/json");
            request.AddParameter("grant_type", "client_credentials");
    
            request.Resource = "/users/huj";
            request.RootElement = "GitHubUser";
    
            RestClient client = getClient2(myUser, myToken);
    
            return Execute<GitHubUser>(client, request);
        }
    
    public RestClient getClient2(字符串用户,字符串令牌)
    {
    RestClient=newrestclient();
    client.BaseUrl=新Uri(BaseUrl);
    client.Authenticator=新的HttpBasicAuthenticator(用户,令牌);
    //client.Authenticator=新的OAuth2UriQueryParameterAuthenticator(令牌);//有效
    //client.Authenticator=new OAuth2AuthorizationRequestHeaderAuthenticator(令牌);//不工作
    返回客户;
    }
    公共GitHubUser GetGitHubUser2()
    {
    RestRequest请求=新的RestRequest();
    request.Resource=“/users/huj”;
    request.RootElement=“GitHubUser”;
    RestClient=getClient2(myUser,myToken);
    返回执行(客户端、请求);
    }
    /// 
    /// http://stackoverflow.com/questions/30133937/how-to-use-oauth2-in-restsharp
    /// 
    ///GitHubUser
    公共GitHubUser GetGitHubUser3()
    {
    //RestRequest请求=新的RestRequest(Method.POST);//空数据
    RestRequest请求=新的RestRequest();
    request.AddHeader(“内容类型”、“应用程序/x-www-form-urlencoded”);
    AddHeader(“接受”、“应用程序/json”);
    AddParameter(“授权类型”、“客户端凭据”);
    request.Resource=“/users/huj”;
    request.RootElement=“GitHubUser”;
    RestClient=getClient2(myUser,myToken);
    返回执行(客户端、请求);
    }
    
    你能展示一下有效的curl命令吗?我在上面添加了curl命令。谢谢,难怪你得了47K分。这就像一场梦。现在我需要弄清楚如何在需要时刷新访问令牌。SimpleAuthenticator和HttpBasicAuthenticator之间有什么区别?base64编码也是在内部完成的吗?感谢您的解决方案,这让我很高兴:)