NGINX, 클라우드 네이티브로 진화, All in OpenNJet
.필요
현재는 auth_basic_user_file만 지원되며 새 사용자를 추가하고 비밀번호를 변경하려면 파일 내용을 수동으로 수정해야 합니다. 유형을 추가해야 합니다: auth_basic_kv, kv를 사용하여 사용자 이름/비밀번호 저장
• 키는 "auth_basic":{prefix}:{user_name}이고 값은 비밀번호입니다. prefix는 server_name 등을 쉽게 구성할 수 있도록 변수를 지원합니다.
•동적으로 항목을 추가하고, 비밀번호를 변경하고, 삭제도 지원하는 HTTP 인터페이스 제공
2.auth_basic_kv 명령어 설계
이 지시어는 main, server, location,limit_conf 블록에서 구성할 수 있습니다. api_limit_ex를 예로 들면 auth_basic_kv 지시어는 njt_http_auth_basic_module 모듈에 배치됩니다. auth_basic_user_file 지시어와 함께 구성할 수는 없습니다.
통사론 | auth_basic_kv {접두사} |
기본 | - |
문맥 | 기본,서버,위치,limit_conf |
접두사는 변수이거나 일반 문자열일 수 있습니다. kv에 저장된 실제 비밀번호 형식은 다음과 같습니다. 키: auth_basic:{prefix}:{user_name} 값: 비밀번호(SHA 알고리즘 사용)
예:
• 사용자 이름이 njet이라고 가정하고 $server_name 변수 형식을 사용합니다. (실제 server_name이 www.baidu.com인 경우) kv 메모리의 실제 저장 공간은 다음과 같습니다. 키: auth_basic:www.baidu.com:njet
• 사용자 이름이 njet이고 고정 문자열 test_prefix 형식이 사용된다고 가정하면 kv 메모리의 실제 저장 공간은 다음과 같습니다. 키: auth_basic:test_prefix:njet
#变量格式
api_limit_except GET {
auth_basic "OpenNJet AUTH API";
auth_basic_kv $server_name;
}
#字符串格式
api_limit_except GET {
auth_basic "OpenNJet AUTH API";
auth_basic_kv test_prefix;
}
메모:
Http 요청이 오면 변수인 경우 해당 변수를 실제 값으로 변환한 후 kv db에서 검색하게 됩니다. 따라서 kv db에 저장된 실제 변수 값은 모두 변수가 아닙니다.
3. 비밀번호 http API 인터페이스 디자인
새로운 njt_http_auth_api_module을 추가합니다. 다른 필수 API 모듈(제어 플레인은 /api 입구를 통해 구성됨)과 마찬가지로 http API 인터페이스를 제공하고 비밀번호 추가, 삭제 및 수정 기능을 제공합니다: /api/v1/auth_kv/{ type} type: [password|role|login]은 예약되어 있으며, 향후에는 role 역할과 로그인을 조작할 수 있습니다.
3.1 비밀번호 인터페이스 설정:
PUT:/api/v1/auth_kv/password 본문의 형식은 다음과 같습니다.
{
"prefix": "www.baidu.com", #对应上面$server_name变量,此处是实际的变量取值
"user_name": "njet",
"password": "123456"
}
或者
{
"prefix": "test_prefix", #此处是明确的字符串前缀
"user_name": "njet",
"password": "123456"
}
에러 코드 | 에러 메시지 | |
---|---|---|
성공률을 높이다 | 0 | 성공 |
사용자가 이미 존재합니다 | 4 | 사용자가 존재했습니다 |
실패 증가 | 4 | 비밀번호 추가 오류 |
매개변수에 null 값이 있습니다. | 삼 | 접두사, 사용자 이름 및 비밀번호는 비워둘 수 없습니다. |
매개변수가 잘못되었습니다. | 삼 | 특정 json 오류가 발생합니다. |
비밀번호 암호화 실패 | 4 | 비밀번호 암호화 오류 |
3.2 비밀번호 수정 인터페이스:
패치:/api/v1/auth_kv/password/{접두사}/{user_name}
#变量取值
/api/v1/auth_kv/password/www.baidu.com/njet
或者
#明确字符串前缀
/api/v1/auth_kv/password/test_prefix/njet
본문은 다음과 같은 형식을 갖습니다.
{
"password": "123456"
}
에러 코드 | 에러 메시지 | |
---|---|---|
수정되었습니다. | 0 | 성공 |
사용자가 존재하지 않습니다 | 4 | 사용자가 존재하지 않습니다 |
편집에 실패하다 | 4 | 비밀번호 수정 오류 |
매개변수에 null 값이 있습니다. | 삼 | 접두사, 사용자 이름 및 비밀번호는 비워둘 수 없습니다. |
매개변수가 잘못되었습니다. | 삼 | 특정 json 오류가 발생합니다. |
비밀번호 암호화 실패 | 4 | 비밀번호 암호화 오류 |
3.3 비밀번호 삭제 인터페이스:
삭제:/api/v1/auth_kv/password/{접두사}/{user_name}
#变量取值
/api/v1/auth_kv/password/www.baidu.com/njet
或者
#明确字符串前缀
/api/v1/auth_kv/password/test_prefix/njet
반환 값
에러 코드 | 에러 메시지 | |
---|---|---|
사용자가 삭제되었습니다. | 0 | 성공 |
사용자가 존재하지 않습니다 | 4 | 사용자가 존재하지 않습니다 |
사용자 삭제 실패 | 4 | 삭제 오류 |
4. 테스트
4.1 테스트 구성(제어 플레인 구성 api_limit_just 블록 테스트를 예로 사용):
테스트용 예시로 Range API 인터페이스에 대한 권한 확인 추가(고정 문자열 접두사) 테스트용 예시로 SSL API 인터페이스에 대한 권한 확인 추가(변수 접두사 사용)
Ctrl.conf
...
load_module modules/njt_http_range_api_module.so; #以range api 设置权限验证普通字符串前缀为例测试
load_module modules/njt_http_ssl_api_module.so; #以range api 设置权限验证变量前缀为例测试
load_module modules/njt_http_auth_api_module.so; #auth kv 模块加载
...
http {
server {
listen 8081;
server_name www.test.com; #下面使用$server_name变量测试
location /api {
dyn_module_api;
api_limit_except /v1/range PUT {
auth_basic "OpenNJet range API";
auth_basic_kv test_kv; #range 使用固定前缀字符串测试
}
api_limit_except /v1/ssl PUT {
auth_basic "OpenNJet ssl API";
auth_basic_kv $server_name; #ssl 使用变量前缀测试
}
}
location /doc {
doc_api;
}
}
}
4.2 범위 고정 문자열 접두사 테스트(사용자 이름: njet 비밀번호 123456)
PUT 사용자 이름 및 비밀번호를 추가합니다. 초기 테스트에는 njet 사용자 및 비밀번호 123456이 없습니다. 범위 API 가져오기 인터페이스에 액세스하고 비밀번호를 입력하라는 메시지가 나타나면 njet/123456을 입력하면 확인이 실패합니다.
인증 구성, njet/123456을 통해 사용자 이름 및 비밀번호 구성
범위 가져오기 인터페이스를 다시 방문하여 njet/123456을 입력하면 확인이 성공적으로 통과됩니다.
패치 비밀번호 변경 테스트
범위 가져오기 인터페이스를 다시 방문하고 njet/12345를 사용하여 실패합니다.
njet/654321 사용, 확인 통과
DELETE 비밀번호 삭제 비밀번호 삭제 테스트
범위에 다시 액세스하고 실패합니다.
4.3 변수 접두어를 사용한 SSL 테스트(사용자 이름: SSL 비밀번호 123456)
PUT 사용자 이름과 비밀번호를 추가하세요. 처음에 SSL 사용자와 비밀번호 123456이 없는지 테스트하세요. ssl get 인터페이스에 액세스하고 비밀번호를 입력하세요. 확인이 실패합니다.
인증 구성 SSL/123456을 통해 사용자 이름과 비밀번호를 구성하고 www.test.com을 접두사로 사용합니다.
SSL get 인터페이스에 다시 액세스하고 ssl/123456을 입력하면 확인이 성공적으로 통과됩니다.
패치 비밀번호 변경 테스트
SSL get 인터페이스에 다시 액세스하고 ssl/12345를 사용하면 실패합니다.
SSL/654321 사용, 확인 통과
DELETE 비밀번호 삭제 비밀번호 삭제 테스트
SSL에 다시 액세스하지 못했습니다.
NJet 애플리케이션 엔진은 커널 재구성을 통해 고유한 런타임 동적 구성 로딩 기능을 달성하며 차세대 고성능 웹 애플리케이션 엔진 입니다 . NJet은 고성능 데이터 플레인 처리 기능을 갖추고 있으며 NJet의 고유한 부조종사 CoPilot 서비스 프레임워크를 통해 클러스터링, 고가용성, 활성 상태 확인 및 선언적 API와 같은 여러 보조 기능을 예약하여 기능 확장을 촉진하고 관리/제어 기능 쌍을 분리합니다. 데이터 플레인에 미치는 영향까지 NJet 애플리케이션 엔진의 성능은 CNCF에서 권장하는 Envoy 애플리케이션 엔진의 3배를 초과합니다. 메일 그룹 공식 홈페이지