2016-05-16 5 views
0

ich die folgende Methode Setup mit erfrischenden oauth Token zu unterstützen:oauth rubocop aufzuräumen Unterstützung

module WhiplashOmniAuthentication 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def from_omniauth(auth) 
     Rails.logger.debug auth.inspect 
     where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 
     user.provider = auth.provider 
     user.uid = auth.uid 
     user.email = auth.info.email 
     user.store_token(auth.credentials) 
     end 
    end 
    end 

    def refresh_token! 
    settings = Devise.omniauth_configs[:whiplash].strategy 
    strategy = OmniAuth::Strategies::Whiplash.new(nil, settings.client_id, settings.client_secret, client_options: settings.client_options) 
    client = strategy.client 
    access_token = OAuth2::AccessToken.new client, token, refresh_token: refresh_token 
    if access_token 
     begin 
     result = access_token.refresh! 
     store_token(result) 
     save 
     rescue OAuth2::Error => e 
     errors[:token] << e.inspect 
     return false 
     end 
    else 
     errors[:token] << e.inspect 
     return false 
    end 
    end 

    def store_token(auth_token) 
    self.token = auth_token.token 
    self.refresh_token = auth_token.refresh_token 
    self.token_expires_at = Time.at(auth_token.expires_at).to_datetime 
    end 

    def token_expired? 
    Time.now > token_expires_at 
    end 
end 

ich schon versucht, diese zu brechen in einzelne Methoden, aber es hält Sprengung, so werde ich die aufzuschieben SO Götter hier. Ich suche nach Empfehlungen, um die Polizei zu übergeben und zu lernen. Danke

+0

Könnten Sie bitte das gesamte Modell posten? Sind Sie sicher, dass Ihr Code korrekt ist? Verwenden Sie TDD, um alle Zweige zu testen? Zum Beispiel glaube ich nicht, dass der Code in der else-Verzweigung für das "if access_token" korrekt ist. –

+0

@EmilianoDellaCasa das ist eigentlich Teil eines Anliegens und ich habe gerade den vollständigen Code für dieses Modul veröffentlicht. –

Antwort

1

Sie haben definitiv zu viele Dinge in der refresh_token! Implementierung. Sie wollen immer Methoden beibehalten, um eine Sache und nur eine Sache zu tun. Es erleichtert das Testen (z. B. Ausgeben einer bestimmten Methode), Debugging und Lesbarkeit.

Prüfen Sie, ob die folgenden hilft:

module WhiplashOmniAuthentication 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def from_omniauth(auth) 
     Rails.logger.debug auth.inspect 
     where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 
     user.provider = auth.provider 
     user.uid = auth.uid 
     user.email = auth.info.email 
     user.store_token(auth.credentials) 
     end 
    end 
    end 

    def refresh_token! 
    access_token ? refresh_access_token! : false 
    end 

    def refresh_access_token! 
    result = access_token.refresh! 
    store_token(result) 
    save 
    rescue OAuth2::Error 
    false 
    end 

    def settings 
    @settings ||= Devise.omniauth_configs[:whiplash].strategy 
    end 

    def strategy 
    @strategy ||= OmniAuth::Strategies::Whiplash.new(nil, settings.client_id, settings.client_secret, client_options: settings.client_options) 
    end 

    def client 
    @client ||= strategy.client 
    end 

    def access_token 
    OAuth2::AccessToken.new(client, token, refresh_token: refresh_token) 
    end 

    def store_token(auth_token) 
    self.token = auth_token.token 
    self.refresh_token = auth_token.refresh_token 
    self.token_expires_at = Time.at(auth_token.expires_at).to_datetime 
    end 

    def token_expired? 
    Time.now > token_expires_at 
    end 
end 
+0

danke @dharam, das hat funktioniert! –

+0

Gedanken zu diesem Follow-up http://stackoverflow.com/questions/37847397/rails-4-oauth-model-concern-rspec-stubs-and-mocks –