- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 CTP 通过 OAuth 2.0 连接 Facebook。
我可以让对 Facebook 的初始请求工作正常,但是当它返回时我们调用:
// Where null will become an HttpRequestInfo object
client.ProcessUserAuthorization(null);
我得到:
The remote server returned an error: (400) Bad Request.
我并没有真正对初始代码库做太多;只需将可选值设置为 null(我们仍在使用 .NET 3.5)。任何线索将不胜感激。
此外,我想这更像是一个专门针对安德鲁的问题;有没有关于这些东西的论坛/博客,或者任何可以定期更新的地方?知道一些事情会很棒:
无论如何,欢迎提出任何建议。
最佳答案
遇到这个问题后,我写了自己的代码来授权,并获取用户的详细信息。另一种方法是使用 Facebook C# SDK .作为其他任何想自己做的人的入门者,我是这样做的。请注意,我没有调查错误情况。
首先,read facebooks doc关于它是如何工作的(它相当简单!)
我是这样消费的:
private static readonly FacebookClient facebookClient = new FacebookClient();
public ActionResult LoginWithFacebook()
{
var result = facebookClient.Authorize();
if (result == FacebookAuthorisationResult.RequestingCode)
{
//The client will have already done a Response.Redirect
return View();
} else if (result == FacebookAuthorisationResult.Authorized)
{
var user = facebookClient.GetCurrentUser();
}
return Redirect("/");
}
和客户端代码:
using System;
using System.IO;
using System.Net;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Web;
namespace Web.Services
{
public enum FacebookAuthorisationResult
{
Denied,
Authorized,
RequestingCode
}
public class FacebookClient
{
private const String SESSION_NAME_TOKEN = "UserFacebookToken";
public FacebookClient()
{
TokenEndpoint = new Uri("https://graph.facebook.com/oauth/access_token");
AuthorizationEndpoint = new Uri("https://graph.facebook.com/oauth/authorize");
MeGraphEndpoint = new Uri("https://graph.facebook.com/me");
ClientIdentifier = "xxxxxxxxxxxxxxxxxx";
Secret = "xxxxxxxxxxxx";
LocalSubDomain = "local.xxxxxxx.com";
}
public Uri TokenEndpoint { get; set; }
public Uri AuthorizationEndpoint { get; set; }
public Uri MeGraphEndpoint { get; set; }
public String Secret { get; set; }
public String ClientIdentifier { get; set; }
private String LocalSubDomain { get; set; }
public FacebookAuthorisationResult Authorize()
{
var errorReason = HttpContext.Current.Request.Params["error_reason"];
var userDenied = errorReason != null;
if (userDenied)
return FacebookAuthorisationResult.Denied;
var verificationCode = HttpContext.Current.Request.Params["code"];
var redirectUrl = GetResponseUrl(HttpContext.Current.Request.Url);
var needToGetVerificationCode = verificationCode == null;
if (needToGetVerificationCode)
{
var url = AuthorizationEndpoint + "?" +
"client_id=" + ClientIdentifier + "&" +
"redirect_uri=" + redirectUrl;
HttpContext.Current.Response.Redirect(url);
return FacebookAuthorisationResult.RequestingCode;
}
var token = ExchangeCodeForToken(verificationCode, redirectUrl);
HttpContext.Current.Session[SESSION_NAME_TOKEN] = token;
return FacebookAuthorisationResult.Authorized;
}
public Boolean IsCurrentUserAuthorized()
{
return HttpContext.Current.Session[SESSION_NAME_TOKEN] != null;
}
public FacebookGraph GetCurrentUser()
{
var token = HttpContext.Current.Session[SESSION_NAME_TOKEN];
if (token == null)
return null;
var url = MeGraphEndpoint + "?" +
"access_token=" + token;
var request = WebRequest.CreateDefault(new Uri(url));
using (var response = request.GetResponse())
{
using (var responseStream = response.GetResponseStream())
{
using (var responseReader = new StreamReader(responseStream))
{
var responseText = responseReader.ReadToEnd();
var user = FacebookGraph.Deserialize(responseText);
return user;
}
}
}
}
private String ExchangeCodeForToken(String code, Uri redirectUrl)
{
var url = TokenEndpoint + "?" +
"client_id=" + ClientIdentifier + "&" +
"redirect_uri=" + redirectUrl + "&" +
"client_secret=" + Secret + "&" +
"code=" + code;
var request = WebRequest.CreateDefault(new Uri(url));
using (var response = request.GetResponse())
{
using (var responseStream = response.GetResponseStream())
{
using (var responseReader = new StreamReader(responseStream))
{
var responseText = responseReader.ReadToEnd();
var token = responseText.Replace("access_token=", "");
return token;
}
}
}
}
private Uri GetResponseUrl(Uri url)
{
var urlAsString = url.ToString();
var doesUrlContainQuestionMark = urlAsString.Contains("?");
if (doesUrlContainQuestionMark)
{
// Remove any parameters. Apparently Facebook does not support state: http://forum.developers.facebook.net/viewtopic.php?pid=255231
// If you do not do this, you will get 'Error validating verification code'
urlAsString = urlAsString.Substring(0, urlAsString.IndexOf("?"));
}
var replaceLocalhostWithSubdomain = url.Host == "localhost";
if (!replaceLocalhostWithSubdomain)
return new Uri(urlAsString);
// Facebook does not like localhost, you can only use the configured url. To get around this, log into facebook
// and set your Site Domain setting, ie happycow.com.
// Next edit C:\Windows\System32\drivers\etc\hosts, adding the line:
// 127.0.0.1 local.happycow.cow
// And lastly, set LocalSubDomain to local.happycow.cow
urlAsString = urlAsString.Replace("localhost", LocalSubDomain);
return new Uri(urlAsString);
}
}
[DataContract]
public class FacebookGraph
{
private static DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(FacebookGraph));
// Note: Changed from int32 to string based on Antonin Jelinek advise of an overflow
[DataMember(Name = "id")]
public string Id { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
[DataMember(Name = "first_name")]
public string FirstName { get; set; }
[DataMember(Name = "last_name")]
public string LastName { get; set; }
[DataMember(Name = "link")]
public Uri Link { get; set; }
[DataMember(Name = "birthday")]
public string Birthday { get; set; }
public static FacebookGraph Deserialize(string json)
{
if (String.IsNullOrEmpty(json))
{
throw new ArgumentNullException("json");
}
return Deserialize(new MemoryStream(Encoding.UTF8.GetBytes(json)));
}
public static FacebookGraph Deserialize(Stream jsonStream)
{
if (jsonStream == null)
{
throw new ArgumentNullException("jsonStream");
}
return (FacebookGraph)jsonSerializer.ReadObject(jsonStream);
}
}
}
关于.net - DotNetOpenAuth CTP - Facebook 错误请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3725159/
我在 menu.ctp 中的 img 链接在 view.ctp 和 login.ctp 中消失了 这是我的菜单.ctp header class="header row">
我对使用 4.0 框架和 Entity Framework 4.0 非常感兴趣。目前 .net 4.0 在 CTP 中,我是 EF 4.0 在 CTP 预览版中。我将不会再编码几个月,但我不确定 .n
我正在使用最新的 Entity Framework CTP 5 版本并构建一个简单的 asp.net MVC 博客,其中我只有两个表:发布和评论。这完全是在 POCO 中完成的,我只需要 DbCont
源代码托管在哪里? git 中心?我到处都找不到它。 最佳答案 是的,它与项目的其余部分一起位于 GitHub 上。它位于 master 分支下。 https://github.com/AArnott
我尝试安装 Async CTP,它说安装已成功完成,但“我的文档”中没有安装任何内容,而且我找不到示例。如何查看带有库的示例并试用它们? 最佳答案 你有另一台可以安装的机器吗? 我的上网本没有正确接受
有谁知道是否可以“Bin 部署”异步 CTP? 由于 Async 的很大一部分基本上是一个编译器技巧,我认为预编译我的应用程序并将其部署到没有安装 Async CTP 的服务器可能会奏效。不幸的是,事
我想在 pdo_error.ctp 中添加一些错误。我到底想做什么?我有一个可以将值插入 MySQL 数据库的表单,如果我将 text 或 varchar 输入留空,然后将其插入到数据库中,但如果我离
在下面的示例中,CTP 仅考虑用户类属性,但我希望用户表中包含基类属性。 有没有办法告诉 CTP 包含基类属性?或者有什么替代解决方案? class PersonDBContext : DbConte
我创建了一个名为 Solution.sln 的空 Visual Studio 解决方案,我将其加载到工作区的第一行。然后我将一个项目添加到解决方案,并将工作区更新为现在应该包含一个项目的最新解决方案。
我一直在基因编程类型的场景中试验 Roslyn API。这似乎是进行此类编程的好方法,但简单场景的实际实现似乎并不是很简单,这意味着我可能不太了解如何正确使用此 API。这是我在实验中尝试修改的一个简
索引页面有样式,而其余页面没有。当我在浏览器中检查级联样式表 (CSS) 文件时,我惊讶地发现除了 Index.ctp 之外,所有页面都无法访问这些 CSS 文件。所有页面都在同一个文件夹中,并且提供
在我的 default.ctp 页面中,我保留适用于整个应用程序的导航和结构内容。例如菜单结构和基于列的 CSS。但是,我想更改我的登录页面,使其看起来完全不同(没有菜单、没有列等) 有没有办法只为单
有什么办法可以勾搭这两个人吗? 我唯一找到的是一篇小文章,上面说截至 2011 年 5 月,MonoTouch 既不支持 Async CTP,也不支持 Reactive Extensions。我真的不
我已经创建了一些示例 ViewModel 来测试 DPs 与 asyncCtp 的使用情况: public class SampleVm : DependencyObject { public
我正在使用 DotNetOpenAuth CTP 库实现一个 oauth 提供程序。所以我创建了一个 mvc3 应用程序,它有一个 OAuth Controller ,其中有 3 个方法,目的是授权第
我目前正在开发一个在很大程度上使用 TAP 的异步应用程序。每个具有生成 Task 方法的类也有一个 TaskScheduler 注入(inject)其中。这使我们能够执行明确的任务调度,据我所知,这
根据此处的博文Data Annotations in the Entity Framework应该有一个名为“Key”的列的属性,它允许您标记实体的主键。但是我无法在 .Net 3.5 或 .Net
我正在通读 TAP Whitepaper ,并且对第 22 页上为实现超时而给出的这个示例感到困惑: “考虑一个 UI 应用程序,它想要下载图像并在下载图像时禁用 UI。但是,如果下载时间过长,则应重
我正在尝试将项目重写为可移植类库。但问题是它使用的是 Async CTP,我无法将其编译为 WP 和 Windows Store App 的库。如果我不包含引用 AsyncCtpLibrary.dll
我想看看 Async CTP 是否带有可移植类库? 最佳答案 没有。异步 CTP 具有适用于桌面、电话、Silverlight 4 和 Silverlight 5 的不同 dll。 希望在不久的将来,
我是一名优秀的程序员,十分优秀!