nginx 모듈 시리즈 인증 요청

5178 단어
이것 은 nginx 의 요청 이 인증 기능 을 갖 출 수 있 는 모듈 입 니 다.그것 은 매우 창의 적 인 기능 을 많이 할 수 있 는데 이것 은 아마도 내 가 가장 추천 하 는 모듈 일 것 이다.현재 nginx 에 내 장 된 모듈 입 니 다. 기본 값 은 열 리 지 않 았 습 니 다.제3자 모듈 이 었 으 나 저 자 는 현재 nginx 소스 관리자 중 한 명 입 니 다.이렇게 연원 과 우수 함 이 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 를 응용 서버 로 만 들 기

좋은 웹페이지 즐겨찾기