1

我正在使用 Tweetinvi 将图像发布到 Twitter。从我们的应用服务器可以正常发布到 Twitter。但是,当从我们的负载均衡器尝试得到这个错误时 -

错误:需要凭据,因为 URL 不包含凭据标识符。

堆栈跟踪:在 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、..)被传递到回调页面。但是在回调页面中仍然看到上述错误。

注意:只有当我尝试在我们的负载均衡器上发布到 Twitter 时才会出现此问题(使用运行良好的单个服务器)。我应该使用不同的重载函数吗?

4

1 回答 1

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使用 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 );

我意识到这是一篇大文章,但我想解释一下它是如何工作的。请让我知道是否有任何不妥之处。

于 2016-06-02T13:03:22.180 回答