Autenticação SDK C# do Facebook - Como lidar com vários “aplicativos” em um aplicativo?
-
14-11-2019 - |
Pergunta
Tenho meu aplicativo Web ASP.NET MVC 3 instalado e funcionando com o SDK C# do Facebook.
Seguindo as instruções aqui, parece que depois de inserir o AppId/Segredo na seção de configuração da web instruída, essas são as configurações retiradas ao usar FacebookApplication.Current
, por exemplo:
var oAuthClient = new FacebookOAuthClient(FacebookApplication.Current)
{
RedirectUri = new Uri(RedirectUrl)
};
Meu aplicativo da Web tem "marca branca", portanto atende dois sites, com dois aplicativos do Facebook separados.
Anteriormente, quando implementei o Facebook Connect, eu tinha uma propriedade global chamada "FacebookApplicationId", que analisava o domínio e descobria qual ID do aplicativo usar.
Existe uma maneira elegante de fazer isso com o SDK C# do Facebook?
Eu poderia simplesmente fazer isso:
var oAuthClient = new FacebookOAuthClient(FacebookApplication.Current)
{
RedirectUri = new Uri(RedirectUrl),
AppId = ManuallyGetTheRightAppIdBasedOnDomain(),
AppSecret = ManuallyGetTheRightAppSecretBasedOnDomain()
};
Mas isso não parece SECO, pois terei que continuar fazendo isso.
Existe uma maneira de colocar alguma inteligência FacebookApplication.Current
, para que o AppId
e AppSecret
as propriedades já estão definidas?
Aberto a toda e qualquer sugestão.
Solução
Acho que entendi:o diretor para FacebookOAuthClient
Leva um IFacebookApplication
.
Então eu criei uma implementação concreta chamada WhiteLabeledFacebookApplication
, que implementa IFacebookApplication
.
WhiteLabeledFacebookApplication
o ctor leva um WebsiteType
enum, então as propriedades para AppId
e AppSecret
leia os valores relevantes do web.config com base no enum passado no ctor.
Então, na minha FacebookController
, (onde faço todas as coisas do FB), tenho uma propriedade privada chamada CurrentFacebookApplication
:
private IFacebookApplication _currentFacebookApplication;
private IFacebookApplication CurrentFacebookApplication
{
get
{
if (_currentFacebookApplication == null)
{
var websiteType = SomeUnimportantCodeWhichWorksOutWebsiteFromUrl();
_currentFacebookApplication = new WhiteLabeledFacebookApplication(websiteType );
}
return _currentFacebookApplication;
}
}
Então eu posso fazer isso:
var oAuthClient = new FacebookOAuthClient(CurrentFacebookApplication)
{
RedirectUri = new Uri(RedirectUrl)
};
E o AppId/Secret correto será retirado - ótimo!
A única coisa que eu gostaria de poder fazer é usar injeção de dependência, mas durante a construção de controladores, não há HttpContext
então não consigo descobrir o tipo de site.
Ainda assim, funciona bem - bastante SECO.
Tiramos o chapéu para os desenvolvedores pelo kit de ferramentas para usar programação orientada por interface.