AuthFlow.CreateCredentialsFromVerifierCode仅在负载均衡器上引发错误

时间:2016-06-02 11:34:36

标签: twitter twitter-oauth tweetinvi

我正在使用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时(使用单个服务器工作正常)。 我应该使用不同的重载功能吗?

1 个答案:

答案 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 );

我意识到这是一个很重要的帖子,但我想解释它是如何运作的。 如果任何事情没有意义,请告诉我。