Я пытаюсь интегрировать приложение Rails с Aweber через OAuth, используя официальный авебер-жемчуг.
Если я следую их потоку в консоли Rails, я могу получить токен доступа, никаких проблем:
oauth = AWeber::OAuth.new(ENV["AWEBER_CONSUMER_KEY"], ENV["AWEBER_CONSUMER_SECRET"])
puts oauth.request_token.authorize_url
# => https://auth.aweber.com/1.0/oauth/authorize?oauth_token=xxxxxxxxxxxxxx
Затем я нахожу этот URL-адрес, введите свои учетные данные, получу код подтверждения и вернусь к консоли rails:
oauth.authorize_with_verifier 'xxxxxx'
# => #<OAuth::AccessToken>
Успех!
Проблема в том, что я хочу сделать это в реальном мире, а не только на консоли, что означает, что мой код Ruby нужно разбить на два отдельных действия. Во-первых, есть действие контроллера, которое перенаправляется на страницу Aweber Oauth:
def aweber
oauth = AWeber::OAuth.new(ENV["AWEBER_CONSUMER_KEY"], ENV["AWEBER_CONSUMER_SECRET"])
redirect_to oauth.request_token(oauth_callback: "http://127.0.0.1:3000/auth/aweber/callback").authorize_url
end
Затем появляется действие, которое получает токен доступа после того, как пользователь вводит свои учетные данные и перенаправляется:
def aweber_callback
oauth = AWeber::OAuth.new(ENV["AWEBER_CONSUMER_KEY"], ENV["AWEBER_CONSUMER_SECRET"])
oauth.authorize_with_verifier(params[:oauth_verifier])
end
Когда я делаю это так, конечная строка (authorize_with_verifier
) всегда поднимает #<OAuth::Unauthorized: 401 Unauthorized>
.
Похоже, проблема в том, что я инициализирую переменную oauth
дважды, то есть у меня есть два несвязанных экземпляра AWeber::Oauth
... и только экземпляр AWeber:: Oauth, сгенерированный authorize_url. получить токен доступа. Но я не могу получить один и тот же экземпляр как в aweber_callback
, так и aweber
, потому что я имею дело с двумя совершенно разными потоками и экземплярами контроллера.
Когда я проверяю oauth
, я вижу, что внутренние переменные oauth.request_token.params["oauth_token"]
и oauth.request_token.params["oauth_token_secret"]
различаются в каждом oauth
, который, как я предполагаю, является причиной проблемы. Я могу получить "правильный" oauth_token
из параметров (params[:oauth_token]
), но я не могу понять, как получить правильный файл oauth_token_secret (не говоря уже о том, что вручную настраиваемые переменные экземпляра, такие как это чувствует очень хаки и, вероятно, не самый лучший подход.)
Как я могу создать токен доступа?