我正在编写一个与Salesforce交谈的应用程序。 Salesforce通过OAuth提供对API的访问。我一直在尝试完成here所述的OAuth身份验证过程。目前,我正在尝试授权我的应用。我有以下代码。
// Ask Salesforce for a request token
var request = (HttpWebRequest)(WebRequest.Create(String.Format("https://login.salesforce.com/services/oauth2/authorize?response_type=code&client_id={0}&redirect_uri=http://localhost:5004/home/AuthCallback", CONSUMER_KEY)));
request.Method = "POST";
request.ContentType = "application/json";
// Retrieve the request token from the response
var response = (HttpWebResponse)(request.GetResponse());
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
string accessCodeData = accessCodeReader.ReadToEnd();
}
当用户单击ASP.NET MVC视图中的按钮时,将触发此代码。执行时,此代码调用Salesforce。我在小提琴手里看到了一个请求。请求标头如下所示:
POST /services/oauth2/authorize?response_type=code&client_id={consumerKey}&redirect_uri=http://localhost:5004/home/AuthCallback HTTP/1.1
我实际上是在传递我的消费者密钥,我只是从示例中删除它。无论如何,这个请求返回302,身体大小为0.我可能会误解一些东西。但是,我希望得到一个请求令牌。然后我将使用请求令牌来获取访问令牌。
我做错了什么?
答案 0 :(得分:3)
您滥用API。
仔细查看其页面上的序列图(在获取访问令牌下):在auhorization_code流程中,您应该将浏览器重定向到他们的页面,以便用户看到登录页面,提供他/她的凭据,然后您获得令牌。相反,您正尝试使用来自服务器的Web请求在那里发布POST。
此特定流程属于被动流组,此组旨在用于浏览器应用程序,您的服务器将浏览器重定向到其服务器,您基本上得到对uri的响应通过在redirect_uri
参数中,这应该指向您服务器上的应用程序。
还有其他流程,其中一个适用于非浏览器应用,它被称为资源所有者密码流程。在此流程中,您的应用程序托管登录UI,并将用户名/密码发送到授权服务器,然后您将获得令牌。无论是否支持此流程,都应在其文档中阅读。
在此处阅读更多内容:http://aaronparecki.com/articles/2012/07/29/1/oauth2-simplified
使用DotNetOpenAuth库了解如何处理到Google的OAuth2流程。这是一个直接的解决方案,将其应用于任何其他提供商应该是直截了当的。
http://www.wiktorzychla.com/2014/11/simple-oauth2-federated-authentication.html