2016-05-20 6 views
9

Derzeit arbeite ich auf Schienen 4 Projekt, und jetzt muss ich eine andere Anwendung verbinden/verbinden (nicht sso aber für den Zugriff auf APIs) sagen Beispiel .com. (Hinweis:example.com verwendet 3-legged oauth Sicherheitsarchitektur)Getting "Authentifizierungsfehler! Invalid_Credentials: OAuth2 :: Error" für benutzerdefinierte Omniauth Strategie

Nach gefunden entsprechend, dass ich Strategie umzusetzen omniouth.

Dafür habe ich this Link verwiesen. Per Strategy-Contribution-Guide bin ich in der Lage, Setup-und Anfrage-Phase abzuschließen, können Sie meinen Beispielcode hier finden.

require 'multi_json' 
require 'omniauth/strategies/oauth2' 
require 'uri' 

module OmniAuth 
    module Strategies 
    class MyAppStrategy < OmniAuth::Strategies::OAuth2 
     option :name, 'my_app_strategy' 

    option :client_options, { 
    site: site_url, 
    authorize_url: authorize_url, 
    request_url: request_url, 
    token_url: token_url, 
    token_method: :post, 
    header: { Accept: accept_header } 
    } 

    option :headers, { Accept: accept_header } 
    option :provider_ignores_state, true 

    def consumer 
    binding.pry 
    ::OAuth::Consumer.new(options.client_id, options.client_secret, options.client_options) 
    end 

    def request_phase # rubocop:disable MethodLength 
    binding.pry 
    request_token = consumer.get_request_token({:oauth_callback => callback_url}, options.request_params) 
    session["oauth"] ||= {} 
    session["oauth"][name.to_s] = {"callback_confirmed" => request_token.callback_confirmed?, "request_token" => request_token.token, "request_secret" => request_token.secret} 

    if request_token.callback_confirmed? 
     redirect request_token.authorize_url(options[:authorize_params]) 
    else 
     redirect request_token.authorize_url(options[:authorize_params].merge(:oauth_callback => callback_url)) 
    end 

    rescue ::Timeout::Error => e 
    fail!(:timeout, e) 
    rescue ::Net::HTTPFatalError, ::OpenSSL::SSL::SSLError => e 
    fail!(:service_unavailable, e) 
    end 

    def callback_phase # rubocop:disable MethodLength 
    fail(OmniAuth::NoSessionError, "Session Expired") if session["oauth"].nil? 

    request_token = ::OAuth::RequestToken.new(consumer, session["oauth"][name.to_s].delete("request_token"), session["oauth"][name.to_s].delete("request_secret")) 

    opts = {} 
    if session["oauth"][name.to_s]["callback_confirmed"] 
     opts[:oauth_verifier] = request["oauth_verifier"] 
    else 
     opts[:oauth_callback] = 'http://localhost:3000/auth/callback' #callback_url 
    end 

    @access_token = request_token.get_access_token(opts) 
    super 
    rescue ::Timeout::Error => e 
     fail!(:timeout, e) 
    rescue ::Net::HTTPFatalError, ::OpenSSL::SSL::SSLError => e 
     fail!(:service_unavailable, e) 
    rescue ::OAuth::Unauthorized => e 
     fail!(:invalid_credentials, e) 
    rescue ::OmniAuth::NoSessionError => e 
     fail!(:session_expired, e) 
    end 

    def custom_build_access_token 
    binding.pry 
    verifier = request["oauth_verifier"] 
    client.auth_code.get_token(verifier, get_token_options(callback_url), deep_symbolize(options.auth_token_params)) 
    end 
    alias_method :build_access_token, :custom_build_access_token 

    def raw_info 
    binding.pry 
    @raw_info ||= access_token.get('users/me').parsed || {} 
    end 

    private 

    def callback_url 
    options[:redirect_uri] || (full_host + script_name + callback_path) 
    end 

    def get_token_options(redirect_uri) 
    { :redirect_uri => redirect_uri }.merge(token_params.to_hash(:symbolize_keys => true)) 
    end 
end 
end 

Ende

Ich bin in der Lage Umleitung zu example.com, auch nach dem Login Ich bin der Lage, meine callback_phase zurückzukehren (Sie werden fragen, woher wissen Sie, so Antwort ist, ich habe hinzugefügt binding.pry in callback_phase Methode zur Überprüfung des Flusses).

Aber nach der Strategie Ausführung erhalte ich folgende Fehler

ERROR - omniauth: (my_app_strategy) Authentifizierungsfehler! invalid_credentials: OAuth2 :: Fehler.

Nach dem Debuggen festgestellt, dass ich diesen Fehler für den super Aufruf (von Callback_phase-Methode) bekomme.

Zuerst dachte ich, da sein können einige Anmeldeinformationen Problem, aber ich bin in der Lage Zugriffstoken holen mit folgenden (die vor dem super Aufruf ausgeführt wird)

@access_token = request_token.get_access_token(opts) 

Auch für weitere Informationen, die ich Störung erhalte für build_access_token die ist die oauth2 Methode

Sie this Link für weitere Informationen (Suche nur die build_access_token auf der Seite) beziehen.

EDIT - 1

Nach dem Debuggen festgestellt, dass immer dieses Problem aus den request method. (Während der Faraday Anfrage). Hier ist der Code-Snippet

response = connection.run_request(verb, url, opts[:body], opts[:headers]) do |req| 
    yield(req) if block_given? 
    end 

Hier ist meine faraday Anfrage

#<struct Faraday::Request method=:post, path="example.com/oauth/access_token", params={}, headers={"User-Agent"=>"Faraday v0.9.2", "Content-Type"=>"application/x-www-form-urlencoded"}, body={"grant_type"=>"authorization_code", "code"=>"aPexxxvUg", "client_id"=>"xxxxxur303GXEch7QK9k", "client_secret"=>"xxxxxxcad97b3d252e2bcdd393a", :redirect_uri=>"http://localhost:3000/auth/my_app_strategy/callback"}, options=#<Faraday::RequestOptions (empty)>> 

Als Antwort erhalte ich folgende Fehlermeldung

HTTP-Status 400 - Unzureichende OAuth-Consumer-Anmeldeinformationen.

Kann jemand helfen, dieses Problem zu beheben?

Gibt es eine andere Möglichkeit, das Zugriffs-Token zu speichern, damit ich es für Kommunikationszwecke verwenden kann. Dank

+2

Sie haben hier Ihren Consumer Key und Ihr Consumer Secret aufgedeckt. Ich habe versucht, sie zu bearbeiten, aber es muss von anderen bestätigt werden, bevor der Schnitt live geht. Bitte vergewissern Sie sich, dass diese Zugangsdaten sofort gelöscht werden und erhalten Sie neue Zugangsdaten, die Sie privat halten. –

+0

@ ScottS. Danke für deine Antwort. Ich werde mich darum kümmern. BTW das sind die Zufallszahlen. –

+0

Gibt es einen Grund, warum Sie https://github.com/intridea/omniauth-oauth2/blob/master/lib/omniauth/strategies/oauth2.rb nicht zur Einrichtung Ihres OAUTH verwendet haben? –

Antwort

2

aller Zuerst habe ich wan klar zu machen, wie OAuth2 funktioniert:

OAuth2, das Protokoll sagt:

  1. Sie den Benutzer zum Provider Zeichen in Endpunkt umleiten einige erforderlichen Parameter angeben (EJm: PROVIDER/öffentlich/oauth? Redirect_uri = MYWEB/oauthDemo & Antworttyp = Code & client_id = ABCDE). Manchmal gibt es auch einen scope/permission/resource-Parameter, der anzeigt, wofür Sie Ihren Zweck haben.

    -> Dann werden die Benutzer Zeichen und ist mit einem Code zu Ihrem Endpunkt MyWeb/public/oauth umgeleitet

  2. Nun müssen Sie den Zugriff anfordern Token eine POST an den Anbieter Endpunkt zu tun. Beispiel:

    POST PROVIDER code = d5Q3HC7EGNH36SE3N & client_id = d4HQNPFIXFD255H & client_secret = 1a98b7cb92407cbd8961cd8db778de53 & redirect_uri = https://example.com/oauthDemo& grant_type = authorization_code

  3. Jetzt haben Sie die access_token und Sie können es Informationen zu erhalten verwenden oder dekodiere es mit JWT.


dies deutlich zu haben, und zu sehen, dass Ihr Anruf scheint corect:

#<struct Faraday::Request method=:post, path="PROVIDER/oauth/access_token", params={}, headers={"User-Agent"=>"Faraday v0.9.2", "Content-Type"=>"application/x-www-form-urlencoded"}, body={"grant_type"=>"authorization_code", "code"=>"aPexxxvUg", "client_id"=>"xxxxxur303GXEch7QK9k", "client_secret"=>"xxxxxxcad97b3d252e2bcdd393a", :redirect_uri=>"MYWEB/auth/my_app_strategy/callback"}, options=#<Faraday::RequestOptions (empty)>> 

Wie die Antwort "HTTP-Status 400 - Unzureichende OAuth-Consumer-Anmeldeinformationen", denke ich, vielleicht haben Sie:

a. Ihr Client ist auf dem Provider nicht gut konfiguriert. Normalerweise verwenden Sie eine Grundkonfiguration auf der Providerseite, damit er Sie erkennen kann. Also vielleicht ist das nicht gut konfiguriert.

b. Es ist ein Ressourcen/Erlaubnis/Bereich-Parameter fehlt oder falsch im ersten Schritt konfiguriert (in der Umleitung an den Anbieter). Wenn Sie nach dem Token fragen, gibt es ein Problem.

+1

Hatten Diskussion mit dem Provider-Team, sie sagten, sie unterstützen die "OAuth1" nicht die "OAuth2", also die Änderungen in der Strategie-Datei. Und es funktioniert, finde die Details (access_token). Danke für die Antwort. –

Verwandte Themen