Django 애플리케이션이 Shiny의 인증/인증 서버로 사용

30800 단어 djangonginxshinyauth
알고 계실 수 있습니다. Shiny Server 두 가지 버전이 있습니다. 개원 및
직업의전문가의 보안 및 인증 기능 향상
SSL 및 LDAP를 통해 제어되는 액세스와 같은 암호 보호 어플리케이션
Active Directory, Google OAuth, PAM, 에이전트 인증 또는 암호
이러한 인증 기능이 필요하지만 원하지 않거나 사용할 수 없는 경우
$9,995 per year Professional Edition을 위한 솔루션을 제공합니다.
본고에서, 나는 어떻게 하나 이상의 반짝이는 응용 프로그램을 포장하는지 보여줄 것이다
인증 및 액세스 제어를 응용 프로그램에 추가하는 데 사용되는 Django 응용 프로그램
응용 프로그램.여기 빛나는 스타는 장고가 아니야, 네가 쓸 수 있으니까.
유명한 NginX 리버스 에이전트 외에
전용 auth-request 모듈이 함께 제공됩니다.
본고에서 사용한 코드도 repository on GitHub를 통해 얻을 수 있다.
Docker 구성이 포함되어 있으므로 쉽게 시도할 수 있습니다.
메뉴에서
  • Overview
  • Wrapping a Shiny app into a Django-powered page
  • Proxying Shiny requests to the Shiny app
  • Adding an authentication step for every Shiny request
  • Try it with a Dockerized project
  • Comments
  • 당신들 대다수의 사람들이 흥미를 느끼는 것은 2절부터입니다.
    하면, 만약, 만약...
    여러 개의 반짝이는 응용 프로그램에 접근할 수 있는 인터페이스를 만들고 싶습니다.

    대리 개요


    우리가 무엇을 실현하고 싶은지 그림을 좀 봅시다.첫 번째 그림
    우리의 클라이언트 - 서버 구조를 보여 줍니다.클라이언트는 서버와 통신할 수 있다
    포트 80 또는 443(HTTP 또는 HTTPs)에서 또는 포트 8000 또는 8100에서는 제외
    Django와 Shiny는 내부적으로 사용됩니다.이것은 통과할 수 있다
    방화벽.
    Wrapping
    두 번째 그림은 클라이언트가 URL을 요청할 때 어떻게 되는지 보여 줍니다.
    반짝이는 응용 프로그램.저희가 반짝이는 프로그램을 Django 드라이브로 포장하면...
    페이지, 요청은 Django에게 NginX에서 직접 에이전트합니다.장고!
    내부 HTTP Get 요청이 있는 초기 반짝임 페이지 HTML 내용 및 표시
    그것은 aiframe에 있다.렌더링으로 돌아가기
    페이지는 NginX로 돌아가고 NginX는 클라이언트에게 되돌려줍니다.

    세 번째 그림은 클라이언트에서 서버까지의 모든 후속 요청을 보여 준다
    WebSocket과 NginX를 통해 Django에 권한을 요청하는 방법NginX
    요청을 받은 후 Django에 하위 요청을 보내 라이센스를 요청합니다.
    Shiny에 요청 에이전트를 보내고 응답을 클라이언트에게 되돌려줍니다.하면, 만약, 만약...
    (HTTP 200) 인 경우 NginX는 Shiny에 요청을 에이전트합니다.하면, 만약, 만약...
    (HTTP 403 또는 기타 오류 코드), NginX를 통해 반환
    클라이언트에 대한 응답으로 HTTP 403

    좋아, 우리 한번 해 보자!우선, 우리가 여기에 사용할 디렉터리를 만듭니다
    레슨:
    mkdir django-shiny
    cd django-shiny
    

    Django 지원 페이지에 빛나는 어플리케이션 포장


    첫 번째 절은 이 점을 따르기 위해 예시 항목을 설정하는 데 도움을 줄 것입니다
    강좌, 그러나 앞에서 기술한 두 단계는 선택할 수 있다.너는 즉시
    이동
    섹션에서는 Docker를 사용하여 사전 설정 예제 항목을 사용합니다.할 줄 알다
    Docker가 아직 없으면 설치해야 합니다.참조
    설치 지침.
    하지만 제품을 포장해야 한다면 세 번째 단계는 재미있을 수 있습니다
    Django가 지원하는 페이지와 사이트에 빛나는 응용 프로그램을 통합하는 것은 Django를 사용하는 것이 아니라
    외부 인증/권한 부여 백엔드로 사용됩니다.
  • Proxying Shiny requests
  • Install Docker
  • The Shiny app
  • Django 애플리케이션 빛나는 어플리케이션


    Injecting the HTML contents in an Iframe 에서 빛나는 응용 프로그램의 예시를 얻을 수 있습니다.
    이 코드는 GitHub에서 사용할 수 있습니다 .shinyapp라는 하위 디렉토리에 클론을 생성합니다.
    git clone --depth=1 https://github.com/rstudio/shiny-examples
    mv shiny-examples/001-hello shinyapp
    rm -rf shiny-examples
    
    우리는 또 빛나는 R 패키지를 설치해야 한다.하면, 만약, 만약...
    설치 후 다음 명령을 사용하여 최신 버전을 설치할 수 있습니다.
    sudo add-apt-repository "deb http://cran.rstudio.com/bin/linux/ubuntu trusty/"
    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9
    sudo add-apt-repository ppa:marutter/rdev
    sudo apt-get update
    sudo apt-get install -y r-base
    
    이 명령을 실행하여 설치합니다.
    sudo R -e "install.packages('shiny', repos='https://cran.rstudio.com/')"
    
    포트 8100에서 Shiny 응용 프로그램을 실행하려면 다음 명령을 사용합니다.
    sudo R -e "shiny::runApp(appDir='shinyapp', port=8100)"
    
    응용 프로그램이 실행 중인지 보려면 http://localhost:8100 으로 이동하십시오.

    RStudio 갤러리 Django 애플리케이션

    djangoapp라는 새 Django 프로젝트를 만듭니다.하면, 만약, 만약...
    시스템에 Django를 설치한 다음pip install Django, 또는 시스템 범위 내의 sudo pip install Django.
    항목을 만들려면 다음 명령을 실행합니다.
    django-admin startproject djangoapp
    
    먼저 SQLite 데이터베이스를 초기화해야 합니다.
    python djangoapp/manage.py migrate
    
    이제 다음 명령을 사용하여 포트 8000에서 Django 응용 프로그램을 실행할 수 있습니다.
    python djangoapp/manage.py runserver localhost:8000
    
    응용 프로그램이 실행 중인지 보려면 http://localhost:8000 으로 이동하십시오.

    이 저장소 Iframe에 HTML 내용 주입


    이때 다음과 같은 트리가 있어야 합니다.
    .
    ├── djangoapp
    │   ├── db.sqlite3
    │   ├── djangoapp
    │   │   ├── __init__.py
    │   │   ├── settings.py
    │   │   ├── urls.py
    │   │   └── wsgi.py
    │   └── manage.py
    └── shinyapp
        ├── app.R
        ├── DESCRIPTION
        └── Readme.md
    
    3 directories, 9 files
    
    우리는 세 가지 주요 단계로 나누어 진행할 것이다.

  • :
  • Iframe을 만들고 DOM에 추가
  • 비동기식 호출
  • 을 통해 JSON 형식으로 빛나는 HTML 내용 가져오기
  • 이 컨텐츠를 Iframe에 주입

  • Create a simple view that renders our wrapping HTML page 작성자:
  • GET 요청으로 컨텐츠 가져오기
  • HTML 해석기
  • 를 사용하여 해석
  • 덤프하여 JSON으로 반환
  • 이 패키지 HTML 페이지 만들기 서라운드 뷰 생성하기


    포장 보기를 만듭니다.먼저 열거되었는지 확인djangoappDjango 설정INSTALLED_APPS:
    # settings.py
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    
        'djangoapp'
    ]
    
    그리고 우리는 urls.py에 URL을 추가할 수 있다.
    from django.contrib import admin
    from django.urls import path
    
    from . import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('shiny/', views.shiny, name='shiny'),
    ]
    
    이제 새로운 views.py 파일에서 보기를 만듭니다.
    touch djangoapp/djangoapp/views.py
    
    from django.shortcuts import render, redirect
    
    def shiny(request):
        return render(request, 'djangoapp/shiny.html')
    

    뷰가 생성되어 빛나는 HTML 내용을 JSON으로 반환합니다. 패키지 HTML 페이지 만들기


    뷰 렌더링 djangoapp/shiny.html 템플릿을 알려주기 때문에
    만들려면 다음과 같이 하십시오.
    mkdir -p djangoapp/djangoapp/templates/djangoapp
    touch djangoapp/djangoapp/templates/djangoapp/shiny.html
    # too much of djangoapp already, I know
    
    그 내용을 써라.우리는 단지 제목 하나만 추가하면 우리가 포장 중이라는 것을 알 수 있다
    다음 스크립트를 추가하여 빛나는 응용 프로그램의 내용을 검색합니다.
    <h1>We are in the wrapping page!</h1>
    
    <div id="contents"></div>
    
    <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
    
    <script>
      $(document).ready(function () {
    
        $.getJSON('{% url "shiny_contents" %}', function (data) {
    
          var iframe = document.createElement("iframe");
          $('#contents').append(iframe);
    
          iframe.contentWindow.document.open();
          iframe.contentWindow.document.write(data.html_contents);
          iframe.contentWindow.document.close();
    
          // Attempt circumvention
          if (iframe.contentWindow.WebSocket)
              WebSocket = iframe.contentWindow.WebSocket;
        });
    
      });
    
    </script>
    
    여기에서 몇 가지 일이 발생했다.
  • IDdivcontents를 선언합니다. 여기서 iframe,
  • 을 추가합니다.
  • JQuery의 $(document).ready$.getJSON 방법으로
    JSON으로 돌아가는 URL에서 HTML 내용을 로드합니다
  • .
  • 작성iframe, 문서에 추가한 다음 HTML 컨텐트 작성
    그 안에 있습니다.우리는 또한 WebSocket 변수를 다시 분배할 것이다iframe 하나.
  • Beautiful Soup 회사 JSON 뷰 만들기


    네가 짐작할 수 있는 바와 같이 일은 아직 완성되지 않았다.추가 필요 shiny_contentsDjango 응용 프로그램의 URL과 보기입니다.뷰가 반환되어야 합니다.
    응용 프로그램의 초기 페이지는 JSON입니다.urls.py에 URL 추가:
    from django.contrib import admin
    from django.urls import path
    
    from . import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('shiny/', views.shiny, name='shiny'),
        path('shiny_contents/', views.shiny_contents, name='shiny_contents'),
    ]
    
    views.py에 추가:
    from django.http import JsonResponse
    from django.shortcuts import render
    
    import requests
    
    from bs4 import BeautifulSoup
    
    
    def shiny(request):
        return render(request, 'djangoapp/shiny.html')
    
    
    def shiny_contents(request):
        response = requests.get('http://localhost:8100')
        soup = BeautifulSoup(response.content, 'html.parser')
        return JsonResponse({'html_contents': str(soup)})
    
    Requests와 BeautifulSoup을 사용하여 HTML 내용을 가져오고 반환합니다.
    텍스트로서 JSON으로 덤프됩니다.더 좋은 방법을 알고 있다면,
    댓글!
    설치 요청 및 미화팀: pip install requests beautifulsoup4.
    좋아, 우리 한번 해 보자!Shiny 응용 프로그램과 Django 응용 프로그램을 실행하고
    에 가서 진전이 어떠한지 봅시다!
    다음 그림과 유사한 내용을 볼 수 있습니다.

    그러나 반짝이는 요청은 대리되지 않았기 때문에 둘 사이에서 잃어버렸을 뿐,
    당신의 반짝이는 응용 프로그램은 응답하지 않을 뿐만 아니라, 정적 자산 때문에 보기 좋은 외관도 없을 것입니다.
    로드되지 않습니다.우리는 다음 절에서 이 문제를 해결할 것이다.
    .
    이것이 바로 설정과 Django 패키지의 반짝이는 페이지입니다.남은 시간
    이 강좌에서 NginX와 Django를 에이전트로 설정하는 방법에 대해 설명합니다.
    및 라이센스 서버.결과는 여기서 시도할 수 있습니다
    저장소: http://localhost:8000/shiny.
    섹션을 참조하십시오.

    대리 빛나는 요청 반짝이는 요청을 반짝이는 응용 프로그램에 에이전트


    이제 NginX가 무대에 오를 때다.우리는 새로운 것을 창조해야 한다./etc/nginx/sites-available/djangoshiny의 항목별 구성 파일입니다.
    우리는 NginX가 유사한 URL을 사용하여 모든 요청을 우리의
    반짝이는 응용 프로그램.다른 모든 요청은 Django 응용 프로그램에 에이전트됩니다.
    # declare your Django app
    upstream djangoapp_server {
        server localhost:8000;
    }
    
    # declare your Shiny app
    upstream shinyapp_server {
        server localhost:8100;
    }
    
    # required for WebSockets
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    
    server {
    
        listen 80;
        server_name localhost;
    
        client_max_body_size 100M;
    
        # normal requests go to Django
        location / {
            proxy_pass http://djangoapp_server;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            proxy_redirect off;
            if (!-f $request_filename) {
                proxy_pass http://djangoapp_server;
                break;
            }
        }
    
        # "shiny" requests go to Shiny
        location ~ /shiny/.+ {
    
            rewrite ^/shiny/(.*)$ /$1 break;
    
            proxy_pass http://shinyapp_server;
            proxy_redirect http://shinyapp_server/ $scheme://$host/shiny/;
    
            # required for WebSockets
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
    
            proxy_read_timeout 20d;
            proxy_buffering off;
        }
    
    }
    
    준비가 완료되면 다음 링크를 통해 이 구성을 활성화합니다.
    sudo ln -s /etc/nginx/sites-available/djangoshiny /etc/nginx/sites-enabled/djangoshiny
    
    이제 NginX를 다시 로드합니다. 이렇게!포트 8000에서 Django를 동시에 시작하는 경우
    포트 8100에 연결할 수 있어야 함 shiny/*Django 패키지의 반짝이는 어플리케이션을 즐겨보세요!
    우리는 신분 검증과 권한 수여를 추가해야 한다.
    로그인/등록/로그아웃 보기를 만드는 방법을 보여 주지 않겠습니다.
    모든 문서를 찾아 온라인으로 Django 인증 시스템을 활성화합니다.
    Django를 인증 서버로 사용하는 방법을 보여 드리겠습니다.
    반짝이기 위해서.

    https://github.com/Pawamoy/docker-nginx-auth-request-django-shiny-example 모든 반짝이는 요청에 인증 절차를 추가합니다


    우리는 대리인이 Shiny에게 요청한 모든 것을 Django의 권한을 얻기를 바란다.이 때문에, 우리
    Try it out 모듈이 사용됩니다.이 모듈은 에서 컴파일되지 않았습니다.
    NginX는 기본적으로 Ubuntu/Debian 등의 릴리스에 사용됩니다.하면, 만약, 만약...
    인증 요청이 활성화된 NginX에서 에서 내가 어떻게 완료했는지 확인합니다.
    더 간단한 해결 방안은 같은 저장소의 Docker 설정을 사용하는 것이다
    인증 요청이 지원되는 공식 NginX 이미지입니다.
    따라서 NginX가 준비되면 설정에 이 인증 절차를 추가합니다
    파일:
    
        location ~ /shiny/.+ {
    
            # we tell nginx to call that location for each request
            auth_request /auth;
    
            rewrite ^/shiny/(.*)$ /$1 break;
    
            proxy_pass http://shinyapp_server;
            proxy_redirect http://shinyapp_server/ $scheme://$host/shiny/;
    
            # this part is needed for WebSockets to work
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
    
            proxy_read_timeout 20d;
            proxy_buffering off;
        }
    
        # the /auth location will send a subrequest to django, URL shiny_auth/
        location = /auth {
            internal;
    
            proxy_pass http://localhost:8000/shiny_auth/;
    
            proxy_pass_request_body off;
            proxy_set_header Content-Length "";
            proxy_set_header X-Original-URI $request_uri;
        }
    
    물론 http://localhost/shiny URL로 호출된 보기를 작성해야 합니다.
    이것은 매우 간단한 문제다.먼저 shiny_auth/에 URL을 추가합니다.
    from django.contrib import admin
    from django.urls import path
    
    from . import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('shiny/', views.shiny, name='shiny'),
        path('shiny_contents/', views.shiny_contents, name='shiny_contents'),
        path('shiny_auth/', views.shiny_auth),
    ]
    
    그리고 urls.py 뷰:
    from django.http import HttpResponse
    
    def shiny_auth(request):
        if request.user.is_authenticated:
            return HttpResponse(status=200)
        return HttpResponse(status=403)
    
    잠깐만!사용자가 인증을 받은 경우 Django는 "OK"라고 말합니다.하면, 만약, 만약...
    경험치가 없으면, Django는 "아니오"라고 말합니다.하지만 너는 어떤 논리를 실현할 수 있다
    사용자가 인증을 받았는지만 확인하는 것이 아닙니다.그대
    Django에서 지원하는 여러 가지 어플리케이션을 여러 URL에서 사용할 수 있습니다.
    (앞에서 설명한 바와 같이 포장 페이지에서),
    허가 제도 등.

    Dockerized 프로젝트 하나로 해볼게요.


    저장소를 복제하고 다음 명령을 사용하여 이미지를 생성합니다.
    git clone https://github.com/Pawamoy/docker-nginx-auth-request-django-shiny-example docker-django-shiny
    cd docker-django-shiny
    sudo make all
    
    첫 번째 구축에는 상당한 시간이 걸릴 것이다.빛나는 Django를 만들 거예요.
    이미지, 정적 자산 얻기, 데이터베이스 만들기, 슈퍼 사용자 만들기, 그리고
    응용 프로그램을 실행합니다.다음으로 이동views.py그것이 움직이는 것을 보았다.
    사용 가능한 http://localhost:8000 명령을 인쇄하려면 make 만 실행하십시오.

    좋은 웹페이지 즐겨찾기