[mysql] MySQL 8.0-클라이언트는 서버가 요청한 인증 프로토콜을 지원하지 않습니다. MySQL 클라이언트 업그레이드 고려

어떤 이유로 서버에 간단하게 연결할 수 없습니다. 기본 설정으로 Node.JS와 함께 최신 MySQL Community 8.0 데이터베이스를 설치합니다.

이것은 내 node.js 코드입니다

    var mysql = require('mysql');

    var con = mysql.createConnection({
      host: "localhost",
      user: "root",
      password: "password",
      insecureAuth : true
    });

    con.connect(function(err) {
      if (err) throw err;
      console.log("Connected!");
    });

아래는 명령 프롬프트에서 발견 된 오류입니다.

C:\Users\mysql-test>node app.js
    C:\Users\mysql-test\node_modules\mysql\lib\protocol\Parse
    r.js:80
            throw err; // Rethrow non-MySQL errors
            ^

Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
    at Handshake.Sequence._packetToError (C:\Users\mysql-
test\node_modules\mysql\lib\protocol\sequences\Sequence.js:52:14)
    at Handshake.ErrorPacket (C:\Users\mysql-test\node_mo
dules\mysql\lib\protocol\sequences\Handshake.js:130:18)
    at Protocol._parsePacket (C:\Users\mysql-test\node_mo
dules\mysql\lib\protocol\Protocol.js:279:23)
    at Parser.write (C:\Users\mysql-test\node_modules\mys
ql\lib\protocol\Parser.js:76:12)
    at Protocol.write (C:\Users\mysql-test\node_modules\m
ysql\lib\protocol\Protocol.js:39:16)
    at Socket.<anonymous> (C:\Users\mysql-test\node_modul
es\mysql\lib\Connection.js:103:28)
    at Socket.emit (events.js:159:13)
    at addChunk (_stream_readable.js:265:12)
    at readableAddChunk (_stream_readable.js:252:11)
    at Socket.Readable.push (_stream_readable.js:209:10)
    --------------------
    at Protocol._enqueue (C:\Users\mysql-test\node_module
s\mysql\lib\protocol\Protocol.js:145:48)
    at Protocol.handshake (C:\Users\mysql-test\node_modul
es\mysql\lib\protocol\Protocol.js:52:23)
    at Connection.connect (C:\Users\mysql-test\node_modul
es\mysql\lib\Connection.js:130:18)
    at Object.<anonymous> (C:\Users\mysql-test\server.js:
11:5)
at Module._compile (module.js:660:30)
at Object.Module._extensions..js (module.js:671:10)
at Module.load (module.js:573:32)
at tryModuleLoad (module.js:513:12)
at Function.Module._load (module.js:505:3)
at Function.Module.runMain (module.js:701:10)

https://dev.mysql.com/doc/refman/5.5/en/old-client.html
https://github.com/mysqljs/mysql/issues/1507 과 같은 것들을 읽었습니다.

그러나 여전히 내 문제를 해결하는 방법을 모르겠습니다. 도움을 주시면 감사하겠습니다 .D



답변

MYSQL Workbench에서 다음 쿼리 실행

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'

어디 root사용자로
localhost당신의 URL로와 password비밀번호 등

그런 다음이 쿼리를 실행하여 권한을 새로 고치십시오.

flush privileges;

연결 한 후 노드를 사용하여 연결해보십시오.

그래도 문제가 해결되지 않으면 @'localhost'부분 없이 시도해보십시오 .


답변

먼저 무슨 일이 일어나고 있는지 분명히하자.

MySQL 8은 플러그 가능한 인증 방법을 지원합니다. 기본적으로 caching_sha2_password우리의 좋은 예전 mysql_native_password( source ) 대신 이름 이 지정된 이름 중 하나 가 사용됩니다 . 여러 핸드 셰이크와 함께 암호화 알고리즘을 사용하는 것이 24 년 동안 존재했던 일반 암호 전달보다 더 안전합니다 !

이제 문제는 mysqljsNode ( npm i mysql노드 코드 와 함께 설치하여 사용 하는 패키지 )에서 아직 MySQL 8의이 새로운 기본 인증 방법을 지원하지 않습니다. 이 문제는 https://github.com/mysqljs/mysql/issues/1507에 있으며 2019 년 7 월 현재 3 년이 지난 후에도 계속 열려 있습니다.

(2019 년 6 월 업데이트 : 이 문제를 해결하기 위해 mysqljs에 새로운 PR 이 있습니다! )
(2020 년 2 월 업데이트 : 분명히 mysqljs 버전 3으로 예정되어 있습니다 . )

당신의 옵션

옵션 1) 좋은 “native_password”를 사용하여 인증하기 위해 “MySQL”을 다운 그레이드

이것이 모두가 여기에서 제안하는 것입니다 (예 : 위의 답변 ). 당신 은 인증에 대한 오래된 방법을 사용하여 괜찮다고 mysql말하는 쿼리를 시작 하고 실행합니다 .rootnative_password

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password ...

좋은 점은 인생이 단순해질 것이며 여전히 아무런 문제 없이 Sequel Pro와 같은 오래된 도구를 사용할 수 있다는 것 입니다. 그러나 문제는 당신이 사용할 수있는보다 안전한 (그리고 시원하고 읽을 수있는) 것들을 이용하지 않는다는 것입니다.

옵션 2) “Node”패키지를 MySQL Connecter X DevAPI로 교체

MySQL X DevAPI for Nodehttp://dev.mysql.com 공식 사용자가 제공하는 Node의 Mysqljs 패키지를 대체합니다 .

caching_sha2_password인증을 지원하는 매력처럼 작동 합니다. ( X 프로토콜 통신에 포트 33060를 사용해야 합니다.)

나쁜 점은 mysql모든 사람들이 익숙하고 의존하는 오래된 패키지를 남겼다는 것입니다 .

좋은 점은 앱이 더 안전 해졌으며 오랜 친구들이 제공하지 않은 새로운 것들을 활용할 수 있다는 것입니다. X DevAPI튜토리얼을 확인하면 유용한 새로운 섹시한 기능이 많이 있음을 알 수 있습니다. 기술 업그레이드와 함께 제공되는 학습 곡선의 가격 만 지불하면됩니다. 🙂

추신. 불행하게도,이 XDevAPI 패키지는 타입 정의 (TypeScript가 이해할 수없는)를 아직 가지고 있지 않으므로 typescript 를 사용하면 문제가 발생합니다. 나는 .d.ts 사용하지 생성하기 위해 노력 dts-gen하고 dtsmake있지만 성공. 따라서 명심하십시오.

건배!


답변

이전 mysql_native_password작품 사용하기 :

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourRootPassword';
-- or
CREATE USER 'foo'@'%' IDENTIFIED WITH mysql_native_password BY 'bar';
-- then
FLUSH PRIVILEGES;

이는되는 caching_sha2_passwordMySQL은 8.0에서 소개되어 있지만 Node.js를 버전은 아직 구현되지 않았습니다. 당신이 볼 수있는 이 풀 요청 하고 이 문제에 대한 자세한 내용입니다. 아마 수정이 곧 올 것이다!


답변

MySQL 8의 전체 단계

MySQL에 연결

$ mysql -u root -p
Enter password: (enter your root password)

비밀번호를 재설정

( your_new_password사용하려는 비밀번호로 교체 )

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_password';
mysql> FLUSH PRIVILEGES;
mysql> quit

그런 다음 노드를 사용하여 연결하십시오


답변

수락 된 답변은 정확하지만 새 사용자를 만든 다음 해당 사용자를 사용하여 데이터베이스에 액세스하는 것이 좋습니다.

create user nodeuser@localhost identified by 'nodeuser@1234';
grant all privileges on node.* to nodeuser@localhost;
ALTER USER 'nodeuser'@localhost IDENTIFIED WITH mysql_native_password BY 'nodeuser@1234';


답변

이 오류가 발생했지만 여전히 MySQL버전 8을 사용하려면을 사용하여 데이터베이스를 만들 때 MySQL 서버에 레거시 인증 플러그인을 사용하도록 지시하면됩니다 Docker.

따라서 compose파일은 다음과 같습니다.

# Use root/example as user/password credentials

version: '3.1'

services:

  db:
    image: mysql:8.0.15
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
       MYSQL_ROOT_PASSWORD: 'pass'
       MYSQL_DATABASE: 'db'
       MYSQL_USER: 'user'
       MYSQL_PASSWORD: 'pass'
    ports:
      - 3318:3306
    # Change this to your local path
    volumes:
      - ~/Database/ORM_Test:/var/lib/mysql


답변

MySQL의 최신 도커 컨테이너

ALTER USER root IDENTIFIED WITH mysql_native_password BY 'password';