所以问题出在您实际上正在使用负载均衡器这一事实。但是让我解释一下身份验证的工作原理以及如何解决您的问题。
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
使用 aauthorization_id
作为参数调用时,它会查看本地字典并尝试获取IAuthenticationContext
.
因为您使用的是负载均衡器,所以执行该服务器的服务器AuthFlow.InitAuthentication
可能与您接收回调请求的服务器不同。
因为您的回调到达不同的服务器,它实际上导致AuthenticationContext
为空。
这就是我试图在文档中解释的内容。
如何解决这个问题?
您需要做的是存储接收回调时继续工作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 );
我意识到这是一篇大文章,但我想解释一下它是如何工作的。请让我知道是否有任何不妥之处。