DotNetOpenAuth.OAuth2.WebServerClient から派生した FacebookAuthClient を作成することで、DNOA バージョン 4.1.0.12182、.Net 3.5、および Facebook を相互に連携させることができました。私が見つけた小さな落とし穴の 1 つは、Cookie ベースのセッションを使用している場合、OAuth 機能を使用する前にセッションにアクセスする必要があるということです。これは、DNOA がセッション ID を状態パラメーターとして使用し、セッションにアクセスしたことがない場合、リクエスト間で変更される可能性があるためです。これにより、Facebook から応答が返ってきたときに状態パラメーターの不一致エラーが発生します。
FacebookAuthClient:
public class FacebookAuthClient : DotNetOpenAuth.OAuth2.WebServerClient
{
private static readonly DotNetOpenAuth.OAuth2.AuthorizationServerDescription Description = new DotNetOpenAuth.OAuth2.AuthorizationServerDescription
{
TokenEndpoint = new Uri("https://graph.facebook.com/oauth/access_token"),
AuthorzationEndpoint = new Uri("https://graph.facebook.com/oauth/authorize")
};
public static readonly string [] ScopeNeeded = { "publish_stream" };
public FacebookAuthClient()
: base(Description)
{
}
}
Facebook.aspx.cs:
public partial class FacebookPage : System.Web.UI.Page
{
private FacebookAuthClient _client = new FacebookAuthClient
{
ClientIdentifier = ConfigurationManager.AppSettings["FBClientId"], //The FB app's Id
ClientCredentialApplicator = DotNetOpenAuth.OAuth2.ClientCredentialApplicator.PostParameter(ConfigurationManager.AppSettings["FBClientSecret"]) // The FB app's secret
}
protected void Page_Load(object sender, EventArgs e)
{
DotNetOpenAuth.OAuth2.IAuthorizationState auth = _client.ProcessUserAuthorization();
if (_auth == null)
{
// Kick off authorization request with the required scope info
client.RequestUserAuthorization(FacebookAuthClient.ScopeNeeded);
}
}
}
これは単なるテスト アプリなので、エラー処理はありませんが、動作するようです。
編集
このすべてに DotNetOpenAuth(unified) NuGet パッケージを使用しました。
編集
ClientCredentialApplicator の作成に欠落していた .PostParameter 呼び出しを追加しました。