如何在 RestSharp 中使用 OAuth2

Posted

技术标签:

【中文标题】如何在 RestSharp 中使用 OAuth2【英文标题】:How to use OAuth2 in RestSharp 【发布时间】:2015-07-19 23:11:27 【问题描述】:

在服务器端(Spring java)整理出 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 和其他信息。

【问题讨论】:

你能展示一下有效的 curl 命令吗? 我在上面添加了 curl 命令。 【参考方案1】:

见RFC 6749 - 4.4.2. Client Credentials - Access Token Request

这里是请求的基本格式

POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials

您的 cURL 请求

curl -H "Accept: application/json" \
     -d grant_type=client_credentials \
     client-app:secret@example.com/myapi/oauth/token 

你的 cURL 命令起作用的原因

    默认Content-Type(如果未指定)和POST(使用-d开关时默认)是application/x-www-form-urlencoded

    默认身份验证类型(如果未指定)为Basic。用户名和密码通过-u 选项或在 URL 中传递

     -u username:password (client-app:secret)
    
     -- or put it in the url --
    
     client-app:secret@example.com/myapi/oauth/token
    

    您还可以使用--basic--digest 指定身份验证类型

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

RestSharp 修复:

    Content-Type 设置为application/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

【讨论】:

谢谢,难怪你有 47K 点。这就像做梦一样。现在我需要弄清楚如何在需要时刷新访问令牌。 SimpleAuthenticator 和 HttpBasicAuthenticator 有什么区别? base64 编码也是在内部完成的吗? 感谢您的解决方案,这让我很开心 :)【参考方案2】:

我可以使用以下两个功能。

 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://***.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);
    

【讨论】:

以上是关于如何在 RestSharp 中使用 OAuth2的主要内容,如果未能解决你的问题,请参考以下文章

RestSharp OAuth2 承载身份验证失败,访问被拒绝

使用RESTSHARP进行OAuth 2身份验证不起作用

如何使用restsharp下载文件

如何在 RestSharp 中向请求正文添加文本

如何使用 RestSharp 使用 JWT 访问令牌和用户声明

如何使用 RestSharp 发布请求