2012-04-23 14 views
23

Zajmuję się tworzeniem aplikacji Node.js przy użyciu PostgreSQL i hostingu na Heroku. Moim problemem jest to, że otrzymuję błąd uwierzytelniania tak:Błąd uwierzytelniania podczas łączenia z bazą danych Heroku PostgreSQL

14:32:05 web.1  | { [error: no pg_hba.conf entry for host "193.40.244.196", user "username", database "database_name", SSL off] 
14:32:05 web.1  | length: 168, 
14:32:05 web.1  | name: 'error', 
14:32:05 web.1  | severity: 'FATAL', 
14:32:05 web.1  | code: '28000', 
14:32:05 web.1  | detail: undefined, 
14:32:05 web.1  | hint: undefined, 
14:32:05 web.1  | position: undefined, 
14:32:05 web.1  | internalPosition: undefined, 
14:32:05 web.1  | internalQuery: undefined, 
14:32:05 web.1  | where: undefined, 
14:32:05 web.1  | file: 'auth.c', 
14:32:05 web.1  | line: '483', 
14:32:05 web.1  | routine: 'ClientAuthentication' } 

To może być problemem SSL, ale to nie powinno być jak wspomniano here. SSL powinien być obsługiwany od razu po wyjęciu z pudełka. Więc jestem zakłopotany i mogę tylko zapytać, co może spowodować ten błąd?

Nie jestem pewien, czy muszę edytować plik pg_hba.conf w moim systemie, ale nie mogę go nawet znaleźć.

Odpowiedz

3

Wpadłem na to sam, to prosta naprawa. Wystarczy podłączyć za pośrednictwem protokołu HTTPS zamiast

+1

Wystarczy wymuszenie na porcie 5572 tego, który jest wymieniony w "konfigurze". –

+13

"Wystarczy połączyć się przez HTTPS". Czy mógłbyś rozwinąć? Masz na myśli określony port 5572, jak sugeruje David Pelaez? To nie działa dla mnie, ani nie określa ssl: true w params jak ktoś inny zasugerował, ani nie określa obu. Używam powiązań javascript, a nie rodzimych. – Jake

27

Node-postgres nie obsługuje SSL w jego javascript powiązania, które masz przy użyciu jeśli zrobić:

var pg = require('pg'); 

Aby uzyskać SSL, trzeba użyć natywnej wiązania przez w ten sposób:

var pg = require('pg').native; 

ty nie trzeba używać SSL, gdy aplikacja jest uruchomiona wewnątrz Heroku, trzeba tylko użyć SSL połączyć zdalnie (gdy aplikacja jest uruchomiona lokalnie).

+0

Nie trzeba natywnego wiązania, aby uruchomić SSL. – JVerstry

+1

Pracowałem dla mnie ... dzięki! (jeśli używasz Sequelize, dodaj 'native: true' do obiektu opcji' new Sequelize') – timborden

+2

Wymaga to 'npm i pg-native' – standup75

7

Wystąpił ten sam problem. Tylko włączone ssl = true w parametrach db.

var pg = require('pg'); 
var params = { host: 'heroku_hostname',user: 'username',password: 'password',database: 'database',ssl: true }; 
var client = new pg.Client(params); 
client.connect(); 
+0

To powinna być zaakceptowana odpowiedź! – whirlwin

16

Po dodaniu tych params i mogą połączyć się postgres'a Heroku przykład z serwerem zewnętrznym, zwłaszcza w konfiguracji knex.js w węźle serwera wyraźnej:

var knex = require('knex')({ 
    client: 'postgres', 
    connection: 'postgres://username:[email protected]:5432/yourdbname?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory' 
}); 
+0

dzięki za przykład z knex! Gdzie znalazłeś tę informację? – triniMahn

+0

nie jestem pewien! ale widzę, że jest to udokumentowane, więc może to było tutaj: https://devcenter.heroku.com/articles/connecting-to-relational-databases-on-heroku-with-java – adrichman

+0

Pomogło mi to! dzięki! – albertpeiro

35

rozwiązywane przez ustawienie PGSSLMODE (http://www.postgresql.org/docs/9.0/static/libpq-envars.html) na Heroku. Mówi PostgreSQL domyślnie do SSL.

$ heroku config:set PGSSLMODE=require 
+6

powinno być oznaczone jako poprawna odpowiedź –

+0

Zgoda. Jest to najlepsza odpowiedź, ponieważ utrzymywała wersje lokalne i zdalne działające z najmniejszą ilością kodu. – saoyr5

+0

idealne rozwiązanie dla Heroku, dziękuję bardzo! – Sebastian

Powiązane problemy