2013-11-22 17 views
5

Devret + Doorkeeper + RocketPants ile Roque'da AngularJS'de ve arka uçta bir ön uçurum var. Şimdilik CORS'yi düzgün şekilde çalıştırıyorum, API'm json yanıtlarını başarılı bir şekilde alabilirim (eğer koruma görevini kapatırsam). Ama şimdi kullanıcıyı uygulamaya çalışıyorum şifre kimlik akış:Kapıcı/oauth/token - boş yanıt

kapıcısının üzerinde: angularjs Açık

resource_owner_from_credentials do |routes| 
    request.params[:user] = {:email => request.params[:username], :password => request.params[:password]} 
    request.env["devise.allow_params_authentication"] = true 
    request.env["warden"].authenticate!(:scope => :user) 
    end 

(src: nils-blum):

var payload = "username="+username+"&password="+password+"&" + 
     "client_id="+client_id+"&client_secret="+client_secret+ 
     "&grant_type=password" 

$http({method: 'POST', 
    url: scope.booksh_server + '/oauth/token', 
    data: payload, 
    headers: {'Content-Type':'application/x-www-form-urlencoded'} 
    } 
).success(function (data) { 
      tokenHandler.set(data.access_token); 
      scope.$broadcast('event:authenticated'); 
}); 

Not: Nils yaklaşımı nesne olarak yükü kullanır Params ile, bir dize değil. Benim durumumda, FORM paramları ile değil, yük ile POST verir ve bu nedenle çalışmaz.

Yanlış kullanıcı/şifre girmek

, raylar oturum diyor ki: iptal olarak

Started POST "/oauth/token" for 127.0.0.1 at 2013-11-22 15:21:08 +0400 
    Doorkeeper::Application Load (0.5ms) SELECT "oauth_applications".* FROM "oauth_applications" WHERE "oauth_applications"."uid" = '981d6d654f5e709b2ca3437401c993a6d09cc91cc3fb16b8e2b3191e6421029c' AND "oauth_applications"."secret" = 'f92c4ec969525352bd03ec1eb810a9952cd0814d37ce5b2b02e8a928b2561e10' ORDER BY "oauth_applications"."id" ASC LIMIT 1 
    User Load (0.9ms) SELECT "users".* FROM "users" WHERE "users"."email" = 'undefined' ORDER BY "users"."id" ASC LIMIT 1 

Krom dev araçlar bu isteği gösterirler. Firebug, 302 Found durumuyla boş yanıt gösteriyor. REST App numaralı kromdan aynı POST'u gerçekleştirdiğimde, UPD: sunucusu aynı şeyi yapar ve 302 Bulundu ve sonra da sign_in sayfası için yeniden yönlendirilir. Doğru kullanıcı/şifre girmek durumunda

Üstelik, firefox 200 OK ile boş tepkisi, DİNLENME erişim belirteci ile uygun json alır gösterir ve krom iptal tepkisini gösterir ve CORS hata atıyor:

XMLHttpRequest cannot load http://0.0.0.0:3000/oauth/token. Origin http://0.0.0.0:9000 is not allowed by Access-Control-Allow-Origin. 

Sunucu günlüğü:

Started POST "/oauth/token" for 127.0.0.1 at 2013-11-22 15:33:22 +0400 
    Doorkeeper::Application Load (0.5ms) SELECT "oauth_applications".* FROM "oauth_applications" WHERE "oauth_applications"."uid" = '981d6d654f5e709b2ca3437401c993a6d09cc91cc3fb16b8e2b3191e6421029c' AND "oauth_applications"."secret" = 'f92c4ec969525352bd03ec1eb810a9952cd0814d37ce5b2b02e8a928b2561e10' ORDER BY "oauth_applications"."id" ASC LIMIT 1 
    User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."email" = '[email protected]' ORDER BY "users"."id" ASC LIMIT 1 
    (0.2ms) BEGIN 
    SQL (0.4ms) UPDATE "users" SET "last_sign_in_at" = $1, "current_sign_in_at" = $2, "sign_in_count" = $3, "remember_token" = $4, "updated_at" = $5 WHERE "users"."id" = 1 [["last_sign_in_at", Fri, 22 Nov 2013 11:32:49 UTC +00:00], ["current_sign_in_at", Fri, 22 Nov 2013 11:33:23 UTC +00:00], ["sign_in_count", 24], ["remember_token", "N5sRI6vE7B6vRNUlih3G2Q"], ["updated_at", Fri, 22 Nov 2013 11:33:23 UTC +00:00]] 
    (17.5ms) COMMIT 
    (1.6ms) BEGIN 
    Doorkeeper::AccessToken Exists (0.3ms) SELECT 1 AS one FROM "oauth_access_tokens" WHERE "oauth_access_tokens"."token" = '72dd81fd85b638fb14f9d081193b1eda0e58f85d6820718ab635fe195c36a689' LIMIT 1 
    SQL (0.3ms) INSERT INTO "oauth_access_tokens" ("application_id", "created_at", "expires_in", "resource_owner_id", "scopes", "token") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id" [["application_id", 1], ["created_at", Fri, 22 Nov 2013 11:33:23 UTC +00:00], ["expires_in", 7200], ["resource_owner_id", 1], ["scopes", ""], ["token", "72dd81fd85b638fb14f9d081193b1eda0e58f85d6820718ab635fe195c36a689"]] 
    (28.1ms) COMMIT 

Bu işi nasıl yapabilirim? E-posta/şifre doğruysa, kimlik doğrulamayı işlemek ve access_token ile yanıt vermek için POST/oauth/token'a ihtiyacım var. Herhangi bir yardım için minnettarım, bu noktada sıkışmış olmaktan yoruldum)

+0

Büyük soru! Ne yazık ki, bir cevabın bulunmasının büyük bir zaman harcamasına ihtiyaç duyacağı çok sayıda mücevher var. – Chandranshu

+0

* Nils'in yaklaşımı, dize değil, param olan nesne olarak yükü kullanır. Benim durumumda, FORM paramları ile değil, yük ile POST verir ve bu nedenle çalışmaz. * - Bu noktayı anlamıyorum. Kullanıcı adı ve parola, POST isteğinin yük veri dosyasında bulunur; bu, bunları sunucuda ayıklayabileceğiniz anlamına gelir. Neden durumun farklı olduğunu söylüyorsun? – Chandranshu

+0

* Ve uygun json nesnesini access_token ile döndürür. Anlayabildiğim gibi, istekle birlikte verilen '_doorkeeper-provider_session' çerezinden dolayı, ancak onu nerede bulabileceğimi bulamıyorum. * - Tek bir test için tarayıcınızın çerez yöneticisinde yok edebilir ve görebilirsiniz. eğer hala çalışıyorsa. – Chandranshu

cevap

8

Yay! Sonunda çalıştım. Yine de web’deki tüm derslerde neden bu kadar kolay değil? Ben CORS için aşağıdaki vardı benim ApplicationController (kök biri değil API kolları bir) içinde:: Sorun geliyor Yani

,

before_filter :set_headers 

    def set_headers 
    headers['Access-Control-Allow-Origin'] = 'http://0.0.0.0:9000' 
    headers['Access-Control-Allow-Methods'] = 'GET, POST, PATCH, PUT, DELETE, OPTIONS, HEAD' 
    headers['Access-Control-Allow-Headers'] = '*,X-Requested-With,Content-Type,If-Modified-Since,If-None-Match' 
    headers['Access-Control-Max-Age'] = '86400' 
    end 

problem haline Kazı ben bu işlev olduğunu tespit ettik/oauth/token çağrıldığında çağrılmaz, ancak API dışında başka herhangi bir yola giderken çağrılan çağrılır (ApplicationController

Doorkeeper, kendi denetleyicilerinizden bağımsız olarak kendi denetleyicilerine sahiptir. Dokümanlar, işte iyi (link) davranışlarını değişen açıklar bana yardımcı budur:

routes.rb:

use_doorkeeper do 
    controllers tokens: 'custom_tokens' 
end 

custom_tokens_controller.rb:

class CustomTokensController < Doorkeeper::TokensController 

    include AbstractController::Callbacks 
    before_filter :set_headers 

    def set_headers 
    puts 'headers set' 
    headers['Access-Control-Allow-Origin'] = 'http://0.0.0.0:9000' 
    headers['Access-Control-Allow-Methods'] = 'GET, POST, PATCH, PUT, DELETE, OPTIONS, HEAD' 
    headers['Access-Control-Allow-Headers'] = '*,X-Requested-With,Content-Type,If-Modified-Since,If-None-Match' 
    headers['Access-Control-Max-Age'] = '86400' 
    end 
end 

Önemli olan Callbacks eklemektir Kapıcı denetleyicileri Metal'dan devralındığı için denetleyiciye dönüştürülür, böylece ekleme rayları before_filter'u bulamaz.

Şimdi iyi görünüyor: Kullanıcı/parola çiftimi doğrular ve access_token değerini döndürür (Umarım çalışır: D). Bir şey yanlışsa, şimdi yönlendirme gelmelidir. Bu, çözümü (özel yönlendirme hatası) bildiğim sorun, bu yüzden şimdi her şey yolunda. Huh! Uzun oldu ... Eğer internet tabanlı tarifler neden yardımcı olmadı bilen varsa, lütfen düşüncelerinizi gönderin =)

+0

' client_secret' istemci tarafı çok görünüyor [sohbette bu tartışmaya devam] güvensiz - bu yöntemi üretimde kullanıyor musunuz? Aynı duruma bakıyorum: -/ –

+0

Merhaba Chris. Ne yazık ki, ne bu projeyle ne de Rails ile daha fazla taşınamadım, yani hayır, üretimde bu yok. – ProdoElmit