2017-03-28 168 views
0

我按照here提供的教程,但無法將客戶端連接到服務器。我總是得到以下錯誤消息(全堆棧跟蹤):嘗試連接到代理時出現「用戶名或密碼錯誤」錯誤

Error: Connection refused: Bad username or password 
at MqttClient._handleConnack (${project_dir}/node_modules/mqtt/lib/client.js:760:24) 
at MqttClient._handlePacket (${project_dir}/node_modules/mqtt/lib/client.js:300:12) 
at process (${project_dir}/node_modules/mqtt/lib/client.js:242:12) 
at Writable.writable._write (${project_dir}/node_modules/mqtt/lib/client.js:252:5) 
at doWrite (${project_dir}/node_modules/mqtt/node_modules/readable-stream/lib/_stream_writable.js:345:64) 
at writeOrBuffer (${project_dir}/node_modules/mqtt/node_modules/readable-stream/lib/_stream_writable.js:334:5) 
at Writable.write (${project_dir}/node_modules/mqtt/node_modules/readable-stream/lib/_stream_writable.js:271:11) 
at Socket.ondata (_stream_readable.js:528:20) 
at emitOne (events.js:77:13) 
at Socket.emit (events.js:169:7) 

我有雙重檢查我的環境變量,其值從我Auth0帳戶來了,(特別是CLIENT_IDDOMAINCLIENT_SECRETCONNECTION),但他們似乎罰款。

我已經改變了客戶端的代碼來匹配當前版本的MQTT.js.代碼如下:

const mqtt = require('mqtt'); 
const settings = { 
    port: 1883, 
    keepalive: 1000, 
    protocolId: 'MQIsdp', // already tried 'MQTT' with protocol version 4 
    protocolVersion: 3, 
    clientId: 'a random id', 
    username: 'an account at Auth0', 
    password: 'the password of the account' 
} 

var client = mqtt.connect('mqtt://localhost', settings); 

client.on("connect", function() { 
    client.subscribe("topic"); 
    console.log("connected"); 
}); 

client.on("message", function (topic, message) { 
    // message is Buffer 
    console.log(message.toString()); 
    client.end(); 
}); 

代理代碼與本教程中介紹的非常相似。我想在改變它之前解決這個錯誤。

const mosca = require('mosca') 
const Auth0Mosca = require('auth0mosca'); 
require('dotenv').config(); 

const settings = { 
    port: 1883 
}; 

if (!process.env.AUTH0_DOMAIN || !process.env.AUTH0_CLIENT_ID || 
    !process.env.AUTH0_CLIENT_SECRET || !process.env.AUTH0_CONNECTION) { 
    throw 'Make sure you have AUTH0_DOMAIN, AUTH0_CLIENT_ID, AUTH0_CLIENT_SECRET and AUTH0_CONNECTION in your .env file'; 
} 

const auth0 = new Auth0Mosca('https://' + process.env.AUTH0_DOMAIN, process.env.AUTH0_CLIENT_ID, process.env.AUTH0_CLIENT_SECRET, process.env.AUTH0_CONNECTION); 

// mosca server 
const server = new mosca.Server(settings); 

server.authenticate = auth0.authenticateWithCredentials(); 
server.authorizePublish = auth0.authorizePublish(); 
server.authorizeSubscribe = auth0.authorizeSubscribe(); 

server.on('ready', setup); 

// MQTT server is ready 
function setup() { 
    console.log('Mosca server is up and running'); 
} 

server.on('clientConnected', function(client) { 
    console.log('New connection: ', client.id); 
}); 

我知道這可能是一個愚蠢的錯誤或庫更新造成這種情況。對於後一種情況,這裏是版本:

"auth0mosca": "^0.1.0", 
"mosca": "^2.3.0", 
"mqtt": "^2.5.0" 

最後,我已檢查請求到達代理。

+1

您可能希望包含經紀商的代碼,以便我們可以看到它實際上在對用戶進行身份驗證時做了什麼 – hardillb

+0

完成,感謝提示! –

+0

我發現了這個問題。我在Auth0中的JsonWebToken簽名算法中指定了RS256算法。但是,Auth0Mosca不會使用它來驗證令牌。我會在稍後寫一個答案,面向所有面臨同樣問題的人。對不起,我問了一些我可以解決的問題! –

回答

0

我有forked存儲庫與教程的代碼並更新其依賴關係到最新版本。此外,還增加了驗證使用RS256算法簽名的JWT的可能性。

這解決了我的問題,我希望它可以幫助所有面臨同樣問題的人。

相關問題