WedX - журнал о программировании и компьютерных науках

Можно ли подключиться к mssql с режимом аутентификации Windows из приложения nodejs, работающего в Linux?

Я пытаюсь подключиться к mssql с режимом аутентификации Windows (не могу это изменить) с nodejs, работающего на Linux-машине. Я пробовал много вещей, все они привели к почти одной и той же ошибке, вот попытка использовать утомительно с этим простым кодом, работающим на Linux-машине с nodejs:

let tedious = require('tedious');
let Connection = tedious.Connection;
const config = {
    userName: 'myUserName', 
    password: 'myPassword', 
    server: 'MyServ',
    options: {
        database: 'MyDbName'
    }
}

function handleConnection(err: any) {
    if (err) console.error("error connecting :-(", err);
    else console.log("successfully connected!!")
}

let connection = new Connection(config);
connection.on('connect', handleConnection);

я получаю эту ошибку

error connecting :-( { ConnectionError: Login failed for user ''. 
at ConnectionError (./node_modules/tedious/lib/errors.js:13:12) 
at Parser.tokenStreamParser.on.token (./node_modules/tedious/lib/connection.js:848:51) 
at Parser.emit (events.js:198:13) 
at Parser.parser.on.token (./node_modules/tedious/lib/token/token-stream-parser.js:37:14) 
at Parser.emit (events.js:198:13) 
at addChunk (./node_modules/readable-stream/lib/_stream_readable.js:298:12) 
at readableAddChunk (./node_modules/readable-stream/lib/_stream_readable.js:280:11) 
at Parser.Readable.push (./node_modules/readable-stream/lib/_stream_readable.js:241:10) 
at Parser.Transform.push (./node_modules/readable-stream/lib/_stream_transform.js:139:32) 
at doneParsing (./node_modules/tedious/lib/token/stream-parser.js:122:14) message: 'Login failed for user \'\'.', code: 'ELOGIN' }

У учетных данных, которые я использовал, есть права SQL (проверено с помощью ODBC на компьютере с Windows). Я что-то не так делаю или это просто невозможно?

29.01.2020

  • Вы неправильно понимаете, как работает проверка подлинности Windows в SQL Server. Когда вы используете проверку подлинности Windows, вы не указываете имя пользователя или пароль явно, вместо этого они автоматически выбирают учетные данные из контекста учетной записи пользователя, под которой выполняется код. Понятно, что для этого требуется, чтобы вы работали под учетной записью Windows, которая находится в том же домене Active Directory, что и SQL Server (или в домене, которому он доверяет). Поэтому, если ваша Linux-машина не присоединена к домену AD и вы не работаете под учетной записью AD, она не может работать. 29.01.2020
  • Является ли это возможным? Да. Это легко? Нет. Вам лучше спросить в сообществах Ubuntu/Linux (зависит от того, какой дистрибутив вы используете) о том, как настроить kerberos в средах unix, если вы должны использовать доверенное соединение. 29.01.2020
  • docs.microsoft.com/en-us/sql/linux/ содержит простой вводный пример (с использованием sqlcmd, но концепция остается неизменной независимо от используемого клиентского кода). 29.01.2020
  • Если бы это было было так просто, @ADyson :) 29.01.2020
  • Это возможно — sequelize.org имеет надежный идентификатор. 29.01.2020
  • @Nelles, это просто библиотека кода ORM. Сам по себе он не разрешает аутентификацию Windows. Он может поддерживать это, но само по себе это не решение. Как я объяснил в своем первом комментарии, контекст, в котором выполняется код, является важным. 29.01.2020
  • В любом случае, если вы не можете подключиться с компьютера с Linux, присоединенного к домену, вы можете либо а) запустить свой код в Windows, либо б) использовать аутентификацию SQL для подключения к БД. 29.01.2020
  • После некоторой работы и многих попыток я могу подключиться к своей БД с моей Linux-машины, используя командную строку tsql -S servNameOnFreeTdsConf -U "domain\userName" -P password с установленными и настроенными freeTDS и ODBC. Тем не менее, мне не повезло с моим приложением nodejs. Тот факт, что мне удалось подключиться с моей машины с Linux, должен означать, что моя машина и учетная запись присоединены к AD сервера, как предложил @ADyson, верно? 30.01.2020
  • В любом случае freetds.org/userguide/domains.htm говорит, что ни один из вариантов [SSPI или Kerberos ] включен, FreeTDS по-прежнему может войти в систему, используя учетную запись домена, но пользователь должен указать имя пользователя и пароль. Но это не то же самое, что доверенная аутентификация, которую ожидают библиотеки SQL, лежащие в основе вашего кода nodeJS. В этих библиотеках, когда вы указываете имя пользователя и пароль, он ожидает, что они будут логином SQL, а не Windows. FreeTDS для этого не используется. 30.01.2020
  • Так что нет, указание доменного пользователя и пароля вручную из FreeTDS ничего не говорит о статусе вашего Linux-компьютера в домене Active Directory. Все это указывает на то, что вам удалось использовать эту конкретную технику, которая поддерживается FreeTDS, но не общими клиентскими библиотеками SQL Server. 30.01.2020
  • PS отдельно от этого я заметил, что ошибка именно Login failed for user '' - т.е. пустая строка. И я также заметил, что во всех примерах на github.com/tediousjs/node-mssql объект конфигурации имеет свойство user, а не userName. Так что это не поможет - ошибка сейчас в том, что он даже не знает, от имени какого пользователя вы хотите подключиться. Несмотря на то, что моя информация выше об аутентификации Windows актуальна, на самом деле ваш код еще даже не беспокоился об этом. 30.01.2020
  • Однако, если вы хотели (и могли) использовать вход в домен, то в соответствии с github.com /tediousjs/node-mssql#configuration-1 Я думаю, вы должны установить параметр domain, а не указывать пользователя и пароль, чтобы он автоматически получал учетные данные текущего пользователя домена. Однако в качестве эксперимента вы можете попробовать установить user: "DOMAIN\username" и пароль и посмотреть, что произойдет. Я подозреваю, что это не сработает, но, я полагаю, стоит попробовать. 30.01.2020

Ответы:


1

@ADyson Большое спасибо за вашу информацию, вам удалось точно определить решение моей плохо сформулированной проблемы, вызванной моим полным отсутствием знаний по этому вопросу, еще раз большое вам спасибо. решение состояло в том, чтобы использовать вход в домен, этот фрагмент работал:

const config = {
    user: MyUserName,
    password: MyPassword,
    server: 'MyServAdress',
    database: 'MyDbName,
    domain: 'MyDomain'
}

const sql = require('mssql');
sql.connect(config).then((pool: any) => {
    console.log('connected!');
}).catch((err: any) => {
    console.log(err);
});
30.01.2020
  • Если это ваш ответ, пожалуйста, отметьте его как ответ. 30.01.2020

  • 2

    Да, действительно, можно получать данные от клиента Linux, используя только включенную аутентификацию Windows. MS SQL Server и NodeJS Linux Server находятся в одной сети. Linux-сервер не присоединен к домену:

    введите здесь описание изображения

    Я использовал это для выполнения моего запроса:

    const sql = require('mssql')
    
    const config = {
      server: 'SERVER',
      database: 'DATABASE',
      user: 'USER',
      password: 'PASSWORD',
      domain: 'DOMAIN',
      options: {
        enableArithAbort: true // required, otherwise deprecation warning
      }
    }
      
    sql.connect(config)
      .then((conn) => {
        console.log('MSSQL: connected');
        conn.query(`SELECT ..`)
          .then(data => console.log(data))
          .then(() => conn.close())
      }).catch(err => { console.log(err) });
    
    14.05.2020
    Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]