AuthFlow.CreateCredentialsFromVerifierCode 仅在负载均衡器上抛出错误

AuthFlow.CreateCredentialsFromVerifierCode throws error only on load balancer

我正在使用 Tweetinvi post将图像发送到 Twitter。 从我们的应用程序服务器到 post 到 Twitter,它工作正常。 但是,当从我们的负载均衡器尝试时出现此错误 -

Error:The credentials are required as the URL does not contain the credentials identifier.

Stack Trace: at 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、..)被传递到回调页面。但是在回调页面还是看到上面的错误

注意:此问题仅在我尝试 post 在我们的负载均衡器上访问 Twitter 时出现(使用单独的服务器工作正常)。 我应该使用不同的重载函数吗?

所以问题出在您实际使用负载均衡器这一事实。但让我解释一下身份验证的工作原理以及如何解决您的问题。

var appCredentials = new ConsumerCredentials("", "");
var authContext = AuthFlow.InitAuthentication(appCredentials, "");

当你调用 AuthFlow.InitAuthentication 时,它 returns 一个 IAuthenticationContext。此上下文包含处理来自 Twitter 的回调所需的所有信息。

但除此之外,Tweetinvi 还向回调添加了一个参数authorization_id,以便它可以将回调请求映射到实际的IAuthenticationContext

var authorizationId = Request.Params.Get("authorization_id");
var userCreds = AuthFlow.CreateCredentialsFromVerifierCode(verifierCode, authorizationId);

当您使用 authorization_id 作为参数调用 AuthFlow.CreateCredentialsFromVerifierCode 时,它将查找本地字典并尝试获取 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 );

我意识到这是一个很大的问题 post,但我想解释一下它是如何工作的。 如果有任何不合理的地方,请告诉我。