OmniAuth OAuth2 как получить доступ к стратегии - ›клиент? чтобы я мог обновить токен?

фон

У меня есть стратегия подкласса omniauth-oauth2, работающая в моем приложении rails. Когда обновлять access_token, я вижу, что мне нужно создать OAuth2::AccessToken. Но для его создания, похоже, требуется OAuth2::Client, который, я думаю, можно получить из «стратегии подкласса omniauth-oauth2».

нашел это решение Обновить токен с помощью Omniauth-oauth2 в приложении Rails Вот как они решили получить стратегию

# the initial param:nil is meant to be a rack object, but since 
# we don't use it here, we give it a nil
strategy = OmniAuth::Strategies::YOUR_PROVIDER.new nil, client_id, client_secret
client = strategy.client

your_expired_at_from_your_provider = Time.now.to_i

hash = {
  access_token: "your access_token from your provider",
  refresh_token: "your refresh_token from your provider",
  expires_at: your_expired_at_from_your_provider,
}
access_token_object = OAuth2::AccessToken.from_hash(client, hash)
access_token_object.refresh!

https://github.com/omniauth/omniauth/blob/v1.6.1/lib/omniauth/strategy.rb#L132 https://github.com/intridea/omniauth-oauth2/blob/v1.4.0/lib/omniauth/стратегии/oauth2.rb#L35 https://github.com/intridea/oauth2/blob/master/lib/oauth2/access_token.rb#L12 https://github.com/intridea/oauth2/blob/v1.4.0/lib/oauth2/access_token.rb#L82

проблема

Чего я не понимаю, так это то, что это выглядит несколько хитроумными способами создания стратегии, давая nil первому аргументу.

«Стратегия подкласса omniauth-oauth2» находится в стойке (как на изображении ниже), поэтому я думаю, что есть способ получить доступ к стратегии из промежуточного программного обеспечения стойки, где-то?

вопрос

Является ли создание стратегии, подобной описанной выше, единственным способом обновить токен?
strategy -> client -> access_token_object -> refresh!


person kukrt    schedule 28.07.2017    source источник


Ответы (2)


Я не мог найти правильный способ, но нашел обходной путь для моей собственной стратегии omniauth:

class MyOrg < OmniAuth::Strategies::OAuth2
  #...
  info do
    {
      'email'        => extra['user'].try(:[], 'email'),
      # ...
      'get_org' => Proc.new do
        get_org
      end
    }
  end

  def get_org
    @org ||= begin
      org_id = extra['user'].try(:[], 'org_id')
      access_token.get(options[:client_options][:site] + "/v1/orgs/#{org_id}").parsed
    end
  end


end

Тогда назовите это как:

hash[:info][:get_org].call
person Pavel Evstigneev    schedule 24.09.2018

Я использовал драгоценный камень oauth2, чтобы освежить его. Вот полное решение для использования стратегии omniauth для доступа к API Google: https://stackoverflow.com/a/57191048/2672869

person Andrew Smith    schedule 24.07.2019