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
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. –
@ ScottS. Danke für deine Antwort. Ich werde mich darum kümmern. BTW das sind die Zufallszahlen. –
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? –