nginx 모듈 시리즈 인증 요청
우리 가 겪 은 프로젝트 에서 사용자 로그 인 인증 은 매우 흔히 볼 수 있 는 기능 점 이다.우 리 는 많은 하위 프로젝트 가 있 을 수 있 습 니 다. 이 하위 프로젝트 들 은 공 통 된 기능 을 가지 고 있 습 니 다.
로그 인 인증 을 받 아야 방문 할 수 있다 는 것 이다.경험 이 있 는 당신 으로서 그것 을 독립 시 키 기 를 바 랍 니 다.아마도 너 는 모든 서브 시스템 이 그것 을 직접 호출 하도록 건장 한 라 이브 러 리 를 추상 화 했 을 것 이다.물론 이것 은 좋 은 방안 이지 만 우 리 는 개발 자 들 의 생활 을 좀 더 편 하 게 해 주 고 싶 습 니 다. 그들 은 인증 이 있 는 지 없 는 지, 심지어 코드 에서 인증 의 그림 자 를 볼 수 없 기 때문에 구조 사 는 신기 하 게 그들 을 도와 이 일 을 해결 해 주 었 습 니 다.
1. 먼저 그것 을 어떻게 실현 하 는 지 살 펴 보 자.
> ./configure --with-http_auth_request_module && make && make install
server {
listen 80;
root html;
location / {
index index.html index.php;
}
#이것 은 아래 에서 사 용 될 것 이다.
location /auth {
proxy_pass http://xx.xx.xx.xx; \ # proxy pass 를 사용 할 수 있 습 니 다.
#return 200; \ # 직접 통과 시 킬 수 있 습 니 다.
#다른 것 도 가능 합 니 다. 이 location 을 정상적으로 사용 하기 만 하면 됩 니 다.
}
location ~ \.php$ {
auth_request /auth; \ # 여 기 는 phop 만 인증 기능 을 갖 추 게 합 니 다.
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
네가 해 야 할 일 은 바로 하 나 를 제공 하 는 것 이다.http://xx.xx.xx.xx인터페이스
200: 인증 성공
403: 인증 실패 401: 특수 xxx: 기타 문제
2. 당신 을 전문가 로 만 들 기
이것 만 으로 는 창의력 이 라 고 부 르 기 에는 부족 합 니 다. 우 리 는 그것 의 실현 을 볼 것 입 니 다. 그러면 더 많은 생각 을 할 수 있 습 니 다. nginx 의 소스 코드 분석 시리즈 에서 말 했 습 니 다. nginx 는 신기 한 메커니즘 인 서브 요청 (subrequest) 이 있 습 니 다...........................................................................................높 고 효과 가 좋다.
지금부터 그것 의 실현 을 분석 합 니 다: src / http / modules / ngx http auth request module. c
a. 지령 을 먼저 보면 두 개 밖 에 없어 요.
"auth_request" => ngx_http_auth_request(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
arcf - > uri = value [1]; 변 수 를 사용 할 수 없 도록 세부 사항 이 있 습 니 다. 변 수 를 가 진 코드 가 있 습 니 다.
}
"auth request set" 이 명령 은 인증 을 통과 한 후에 변 수 를 설정 하 는 것 을 요청 하 는 것 입 니 다. 이것 은 아주 좋 습 니 다. 먼저 누 르 십시오.
단계 설정
ngx_http_auth_request_init(ngx_conf_t *cf)
{
ngx_http_handler_pt *h;
ngx_http_core_main_conf_t *cmcf;
cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers);
if (h == NULL) {
return NGX_ERROR;
}
*h = ngx_http_auth_request_handler;
return NGX_OK;
}
subrequest 의 원본 코드 는 좀 복잡 합 니 다. 새 편 으로 분석 할 것 입 니 다. 여 기 는 분석 하지 않 습 니 다. auth request 는 sub request 에 의존 합 니 다. 알 아야 합 니 다.
ngx http auth request handler 코드 에서 return NGX AGAIN 을 되 돌려 주면 이 함수 가 계속 호출 됩 니 다.
fastcgi 의 handler 를 놓 치지 않 고 fastcgi 이전에 호출 할 것 이 라 고 상상 합 니 다. auth request 는 ACCESS 단계 에서 발생 하기 때 문 입 니 다. fastcgi 는 CONTENT 단계 에서 발생 하고 ACCESS 는 CONTENT 전에 발생 합 니 다.
3, 처리 요청 ngx http auth request handler
static ngx_int_t
ngx_http_auth_request_handler(ngx_http_request_t *r)
{
...
ctx = ngx_http_get_module_ctx(r, ngx_http_auth_request_module);
if (ctx != NULL) {
/* fastcgi , done */
if (!ctx->done) {
return NGX_AGAIN;
}
/* :3 */
/* auth_request_set */
if (ngx_http_auth_request_set_variables(r, arcf, ctx) != NGX_OK) {
return NGX_ERROR;
}
/* 403, */
if (ctx->status == NGX_HTTP_FORBIDDEN) {
return ctx->status;
}
/* 401, , */
if (ctx->status == NGX_HTTP_UNAUTHORIZED) {
sr = ctx->subrequest;
...
return ctx->status;
}
/* 2xx */
if (ctx->status >= NGX_HTTP_OK
&& ctx->status < NGX_HTTP_SPECIAL_RESPONSE)
{
return NGX_OK;
}
/* */
return NGX_HTTP_INTERNAL_SERVER_ERROR;
}
...
ps = ngx_palloc(r->pool, sizeof(ngx_http_post_subrequest_t));
ps->handler = ngx_http_auth_request_done;
ps->data = ctx;
/* :1 */
ngx_http_subrequest(r, &arcf->uri, NULL, &sr, ps, NGX_HTTP_SUBREQUEST_WAITED);
...
ctx->subrequest = sr;
return NGX_AGAIN;
}
/* :2 */
static ngx_int_t
ngx_http_auth_request_done(ngx_http_request_t *r, void *data, ngx_int_t rc)
{
ngx_http_auth_request_ctx_t *ctx = data;
ctx->done = 1;
ctx->status = r->headers_out.status;
return rc;
}
여기까지 비밀 이 없습니다. 반환 값 과 auth request set 를 결합 하면 더 재 미 있 는 것 을 할 수 있 습 니 다. 예 를 들 어 제 가 쓴 nginx 동적 대 리 를 할 수 있 습 니 다.
심지어 당신 에 게 더 적합 한 모듈 로 쓸 수 있 습 니 다. 공 유 를 기대 합 니 다.
본문 끝!
추천 읽 기: lua 로 nginx 를 응용 서버 로 만 들 기
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.