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,但我想解释一下它是如何工作的。
如果有任何不合理的地方,请告诉我。
我正在使用 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,但我想解释一下它是如何工作的。 如果有任何不合理的地方,请告诉我。