C# 如何在RestSharp中使用OAuth2
在服务器端(SpringJava)整理OAuth2几天后,我开始使用C#编写的客户机。我正在使用RestSharp调用我的web API,但我在使用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
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命令工作的原因
-d
开关时的默认设置)的默认内容类型是application/x-www-form-urlencoded
-u
选项或URL传递
-u用户名:密码(客户端应用程序:机密)
--或者把它放在url中--
客户端应用程序:secret@example.com/myapi/oauth/token
您还可以使用--basic
或--digest
-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编码也是在内部完成的吗?感谢您的解决方案,这让我很高兴:)