我正在使用Tweetinvi将图片发布到Twitter。 从我们的App服务器工作正常发布到Twitter。 但是,当我们从负载均衡器尝试收到此错误时 -
错误:凭据是必需的,因为URL不包含 凭证标识符。
Stack Trace:在Tweetinvi.AuthFlow.CreateCredentialsFromVerifierCode(String verifierCode,String authorizationId,IAuthenticationContext authContext)
我的代码段就像这样 -
var verifierCode = Request.Params.Get("oauth_verifier");
var authorizationId = Request.Params.Get("authorization_id");
var userCreds = AuthFlow.CreateCredentialsFromVerifierCode(verifierCode, authorizationId);
我看到这些参数(oauth_verifier,authorization_id,..)被传递给回调页面。但仍然在回调页面中看到上述错误。
注意:此问题仅在我尝试在我们的loadbalancer上发布到Twitter时(使用单个服务器工作正常)。 我应该使用不同的重载功能吗?
答案 0 :(得分:2)
所以问题来自于您实际使用的是负载均衡器。但是,让我解释一下身份验证的工作原理以及如何解决问题。
var appCredentials = new ConsumerCredentials("", "");
var authContext = AuthFlow.InitAuthentication(appCredentials, "");
当您致电AuthFlow.InitAuthentication
时,会返回IAuthenticationContext
。此上下文包含处理来自Twitter的回调所需的所有信息。
但除此之外,Tweetinvi还在回调中添加了一个参数authorization_id
,以便它可以将回调请求映射到实际的IAuthenticationContext
。
var authorizationId = Request.Params.Get("authorization_id");
var userCreds = AuthFlow.CreateCredentialsFromVerifierCode(verifierCode, authorizationId);
当您使用AuthFlow.CreateCredentialsFromVerifierCode
作为参数致电authorization_id
时,它会查看本地字典并尝试获取IAuthenticationContext
。
由于您使用的是负载均衡器,因此执行AuthFlow.InitAuthentication
的服务器可能与您收到回叫请求的服务器不同。
因为您的回调到达不同的服务器,实际上导致AuthenticationContext
为空。
我试图在documentation中解释这一点。
您需要做的是存储IAuthenticationContext
所需的CreateCredentialsFromVerifierCode
信息,以便在收到回调时继续工作。我建议你将它存储在你的数据库中。
当您收到回调时,您必须从数据库中获取这些信息。要做到这一点,我建议当你最初调用``你添加回调url一个参数,其值存储数据库中的身份验证ID(例如my_auth_db_id=42
)。
var authContext = AuthFlow.InitAuthentication(appCredentials, "http://mywebsite.com?my_auth_db_id=42");
当您的回叫到达时,您将能够:
var myDBAuthId = Request.Params.Get("my_auth_db_id");
使用此值,您现在可以使用所需信息(存储在数据库中)创建新令牌。
var token = new AuthenticationToken()
{
AuthorizationKey = "<from_db>",
AuthorizationSecret = "<from_db>",
ConsumerCredentials = creds
};
现在您已准备好完成操作:
var userCreds = AuthFlow.CreateCredentialsFromVerifierCode(verifierCode, token );
我意识到这是一个很重要的帖子,但我想解释它是如何运作的。 如果任何事情没有意义,请告诉我。