자체 호스팅 Hasura + GoTrue = ️
19299 단어 hasurajwtgotrueauthentication
하수라 + 고트루 = ❤️
이것은 Netlify's GoTrue 의 약간 확장된 버전입니다. Hasura과 함께 배포할 수 있는
docker-compose.yaml
파일이 포함되어 있습니다. 이 설정은 PostgreSQL에 대한 Hasura 및 MariaDB에 대한 GoTrue의 두 데이터베이스를 사용합니다. 재미있게 보내세요!배경
설정Hasura은 매우 쉽습니다. 그러나 즉시 인증을 받지 못한다는 사실에 실망하게 됩니다. 유료 옵션이나 Firebase를 사용하려면 많은 튜토리얼 블로그를 읽어야 합니다.
GoTrue은 간단하면서도 견고한 인증 및 사용자 관리 도구입니다. 매우 가볍고 간단합니다. 사용자를 등록하고 확인하며 암호를 재설정하도록 도울 수 있습니다. 인증 수단은 JWT입니다. 즉, 클라이언트는 가입 후 사용자 이름과 암호를 시스템에 보내고
access_token
및 refresh_token
를 받습니다. 이렇게 하면 클라이언트가 요청할 때마다 토큰을 첨부할 수 있습니다.Hasura은 Elixir를 사용하여 PostgreSQL 위에 구축된 매우 깔끔한 GraphQL 엔진입니다. 이를 통해 다양한 프로그래밍 언어로 작성된 웹, 모바일 및 데스크톱 애플리케이션을 사용하여 사용할 수 있는 확장성이 뛰어난 GraphQL API를 제공합니다. Hasura는 JWT 및 WebHooks를 포함한 여러 인증 및 권한 부여 옵션을 위한 공간을 제공한다는 점에서 좋습니다.
JWT를
Authorization: Bearer token
형식으로 hasura에 보내면 Hasura 엔진이 미리 구성된 비밀을 사용하여 토큰의 서명을 확인합니다. 따라서 인증을 확인하기 위해 서버 측에서 발급자에게 토큰을 보낼 필요가 없습니다. Hasura는 단순히 서명을 확인하고 체크아웃하면 토큰 내부에서 사용 가능한 클레임에 따라 요청을 승인합니다.주장과 GoTrue로 이어집니다. Hasura는 GoTrue에서 생성된 토큰 내에서 기본적으로 사용할 수 없는 일부 사용자 정의 클레임을 요구합니다. 그래서 저는 GoTrue 소스 코드를 가져와
token.go
파일을 확장하여 생성된 토큰 내부에 Hasura 클레임을 포함시켰습니다.이는 GoTrue 코드의 나머지 부분이 예상대로 작동하고 나중에 쉽게 업데이트할 수 있음을 의미합니다. 추가된 코드는 10줄 미만이고 저는 Go를 처음 사용하므로 기능을 추가하는 더 짧은 방법이 있을 수 있습니다.
내가 사용하는 배포 파일도 포함시켰습니다. 이것은 기본적으로 작동해야 하지만 문제가 있습니다.
전개
이 저장소를 복제하고
.env
파일을 수정하여 원하는 암호, 도메인 및 전자 메일의 smtp 설정을 포함하도록 한 다음 docker-compose up -d
를 실행합니다.docker-compose.yaml
파일은 다음과 같습니다.version: "3"
services:
postgres:
image: postgres:12
restart: always
volumes:
- db_data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: pgpassword
hasura:
image: hasura/graphql-engine:v1.3.3
ports:
- "5000:5000"
depends_on:
- "postgres"
restart: always
environment:
HASURA_GRAPHQL_DATABASE_URL: postgres://postgres:pgpassword@postgres:5432/postgres
## enable the console served by server
HASURA_GRAPHQL_ENABLE_CONSOLE: "true" # set to "false" to disable console
## enable debugging mode. It is recommended to disable this in production
HASURA_GRAPHQL_DEV_MODE: "true"
HASURA_GRAPHQL_UNAUTHORIZED_ROLE: public
HASURA_GRAPHQL_SERVER_PORT: 5000
HASURA_GRAPHQL_ENABLED_LOG_TYPES: startup, http-log, webhook-log, websocket-log, query-log
## uncomment next line to set an admin secret
HASURA_GRAPHQL_ADMIN_SECRET: AdminSecretHere
HASURA_GRAPHQL_JWT_SECRET: '{"type": "HS256", "key": "changethismorethan32characterstring"}'
caddy:
image: abiosoft/caddy
depends_on:
- "web"
restart: always
environment:
ACME_AGREE: "true"
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/Caddyfile
- caddy_certs:/root/.caddy
db:
image: mariadb:10
restart: unless-stopped
env_file: .env
environment:
MYSQL_ROOT_PASSWORD: dbpassword
volumes:
- mariadb:/var/lib/mysql
ports:
- 3306
gotrue:
build: gotrue
restart: unless-stopped
env_file: .env
environment:
- PORT=${GOTRUE_PORT}
- "DATABASE_URL=${MYSQL_USER}:${MYSQL_PASSWORD}@tcp(db:3306)/${MYSQL_DATABASE}?parseTime=true&multiStatements=true"
ports:
- ${GOTRUE_PORT}:${GOTRUE_PORT}
depends_on:
- db
volumes:
caddy_certs:
db_data:
mariadb:
캐디 서버
Caddyfile
는 다음과 같습니다.hasura.example.com {
bind {$ADDRESS}
proxy / hasura:5000 {
transparent
}
tls [email protected]
}
gotrue.example.com {
bind {$ADDRESS}
proxy / gotrue:9999 {
transparent
}
tls [email protected]
}
_설정에 맞게
docker-compose.yaml
파일과 Caddyfile
를 수정하십시오.그런 다음 다음을 수행하여 실행 중인
gotrue
컨테이너 내에서 마이그레이션을 수동으로 실행해야 합니다.docker-compose exec gotrue /bin/ash
gotrue migrate
첫 번째 명령은 실행 중인 컨테이너
gotrue
의 셸을 불러옵니다. gotrue
이미지는 알파인에서 빌드되었으므로 기본 셸은 ash
입니다. zsh
또는 bash
를 찾지 마십시오.두 번째 명령은 컨테이너 내에서 실행할 명령으로 마이그레이션을 실행하고 이제 테스트할 준비가 되었습니다.
테스트
사용자 가입
곱슬 곱슬하다:
curl --location --request POST 'https://gotrue.example.com/signup' \
--header 'Content-Type: application/json' \
--data-raw '{
"email": "[email protected]",
"password": "password"
}'
자바스크립트:
var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({"email":"[email protected]","password":"password"});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://gotrue.example.com/signup", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
이 사용자에 대한 토큰 받기
curl --location --request POST 'https://gotrue.example.com/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=password' \
--data-urlencode '[email protected]' \
--data-urlencode 'password=password'
var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/x-www-form-urlencoded");
var urlencoded = new URLSearchParams();
urlencoded.append("grant_type", "password");
urlencoded.append("username", "[email protected]");
urlencoded.append("password", "password");
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: urlencoded,
redirect: 'follow'
};
fetch("https://gotrue.example.com/token", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
응답:
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c",
"token_type": "bearer",
"expires_in": 864000,
"refresh_token": "aWF0IjoxNTE2MjM5-2kNw"
}
Hasura에 대한 graphQL 요청에서 토큰 사용
위의 토큰이 주어지면 Hasura에 요청할 때 제공된 액세스 토큰을 추가하십시오. 예를 들면 다음과 같습니다.
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀
https://github.com/CkCreative/hasura_gotrue
Reference
이 문제에 관하여(자체 호스팅 Hasura + GoTrue = ️), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/mikeck/self-hosted-hasura-gotrue-2260텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)