맞춤형 인증부터 플러그 앤 플레이 인증까지, 요즘 Ruby 개발자들은 선택할 수 있는 것이 많습니다. 그러나 아시다시피 자체 솔루션을 구축하는 것은 비용이 많이 들고 위험할 수 있습니다. Devise가 대부분의 팀의 사실상 표준이라면 대안은 대부분의 팀의 삶을 단순화할 수 있습니다.
이 문서에서는 역할 처리부터 사용자 인증을 위해 여러 공급자에 의존하는 것까지 제대로 진행하는 데 필요한 모든 것을 포함하여 Ruby on Rails 애플리케이션에서 Auth0의 설정 및 사용을 다룹니다.
시작하기
시작하려면 다음 사항을 따르세요.
- Auth0 계정
- Ruby on Rails 애플리케이션(버전 7.x 이상)
Auth0은 최대 7,000명의 사용자를 처리할 수 있는 무료 등급을 갖춘 타사 인증 서비스입니다. 시작하기에 충분하며 더 많은 고급 기능이 필요한 경우 가격이 합리적입니다.
Auth0에서 Ruby 앱 구성
귀하의 애플리케이션은 Auth0을 사용하여 리디렉션 및 호출을 통해 사용자를 인증하므로 보안을 유지해야 합니다.
Auth0 계정에서 테넌트 내에 애플리케이션을 만들어 보겠습니다. 한 계정에 여러 테넌트를 생성하여 다음을 구분할 수 있습니다:
- 도메인 이름.
- 다양한 환경(개발, 생산 등)
- 데이터가 저장될 국가 또는 지역입니다.
첫 번째 테넌트를 만든 후에는 애플리케이션을 빌드할 수 있습니다. 여기서부터 시작하겠습니다.
응용 프로그램 패널의 "설정" 탭으로 이동하세요. 다음을 복사하여 붙여넣고 안전한 장소에 저장해야 합니다:
- 도메인 이름:
app-name.[eu,us,..].auth0.com - 고객 ID
- 고객의 비밀
다음 애플리케이션 URI도 입력해야 합니다. 로컬 개발 설정에 다음 값을 사용합니다:
- 허용된 콜백 URL:
http://localhost:3000/auth/auth0/callback(URL Auth0은 인증 후 리디렉션됩니다.) - 허용된 로그아웃 URL:
http://localhost:3000(누군가 로그아웃하면 URL Auth0이 리디렉션됩니다.)
이제 앱을 구성해 보겠습니다.
Ruby on Rails 애플리케이션 준비
rails new를 사용하여 바닐라 Ruby on Rails 애플리케이션으로 시작할 수 있습니다. 명령을 내리세요.
데이터베이스로 SQLite3을 사용하고 CSS 라이브러리로 Tailwind를 사용하는 것을 생성해 보겠습니다. 미니 테스트 설치를 건너뛰고 애플리케이션 이름을 "Auth0 기사"로 지정하세요:
몇 가지 속성만으로 사용자 모델을 생성하세요:
이는 우리 애플리케이션을 위한 간단하면서도 효율적인 기반을 구축합니다.
앱에 Auth0 Gem 추가
omniauth-auth0이 필요합니다. 및 omniauth-rails_csrf_protection Ruby on Rails 애플리케이션에서 Auth0을 사용합니다.
Auth0 구성
작은 구성 파일(config/auth0.yml)을 만들어야 합니다. ) 개발 환경에 자격 증명을 저장합니다.
여기서는 erb를 사용하여 환경 변수를 사용할 수도 있습니다.
물론 Ruby on Rails 자격 증명을 사용하면 최신 상태를 유지할 수 있습니다.
이 파일은 Auth0 초기화 프로그램(config/initializers/auth0.rb)에서 사용됩니다. ), 이제 다음을 생성하겠습니다:
여기서 볼 수 있듯이 Rails.application.config_for를 사용하고 있습니다. YAML 파일의 콘텐츠를 편리한 해시로 로드합니다. 이를 Rails 암호화 자격 증명 저장소를 포함한 모든 비밀 처리 라이브러리로 대체할 수 있습니다.
다음 사항에 유의하세요:
- 공급자 이름(
:auth0) - YAML 파일의 세 가지 항목은
AUTH0_CONFIG을 통해 읽고 사용됩니다. 해시. callback_path키와 값은 Auth0 인터페이스에서 구성한 것과 일치합니다.authorize_params그리고scope그 안에 열쇠; 이에 대해서는 나중에 다시 다루겠습니다.
인증을 허용하려면 인터페이스와 라우팅 요소를 만들어야 합니다.
Tailwind를 사용하여 경로 및 UI 설정
이 예에서는 TailwindCSS와 함께 프레임워크 버전 7.1을 사용하여 Ruby on Rails 애플리케이션으로 작업합니다.
다음 명령을 사용하세요:
그런 다음 인증 프로세스 테스트를 준비하면서 인덱스 작업을 사용하여 두 개의 컨트롤러를 추가할 수 있습니다.
이 두 명령을 사용하면 다음이 생성됩니다:
- 둘 다
public_controller.rb및private_controller.rb인덱스 작업을 사용할 준비가 된 컨트롤러 - 두 가지 관련 경로
- 관련 보기
콜백 및 실패를 처리하기 위해 Auth0 컨트롤러를 추가해 보겠습니다. 컨트롤러 파일(bin/rails g controller auth0)을 생성합니다. ) 다음을 추가하세요:
그런 다음 세 가지 작업을 사용하도록 경로를 업데이트하세요.
그런 다음 Login을 추가할 수 있습니다. 및 Logout 공개 및 비공개 보기의 버튼:
이제 'http://localhost:3000'으로 이동할 수 있습니다. Login를 사용하세요 버튼을 클릭하면 비공개 페이지로 리디렉션됩니다. 페이지. 거기에서 Logout을 찾을 수 있습니다. 버튼을 누르세요.
하지만 몇 가지가 빠졌습니다:
- 사용자 프로필의 데이터
- 사용자 식별 및 승인 처리
범위 및 데이터 작업
몇 단계 뒤로 돌아가서 초기화 프로그램(config/initializers/auth0.rb)을 다시 가져오겠습니다. ):
여기서 중요한 부분은 범위:openid profile입니다. . 이는 Auth0에게 다음과 같은 몇 가지 정보에 관심이 있음을 알려줍니다.
- 공급자 이름(Auth0)
uid:사용자와 일치하는 고유 식별자info해시:이름, 프로필 사진 URL 및 빈 '이메일' 키가 포함되어 있습니다.extra_infohash:이름과 프로필 사진뿐 아니라 한 쌍의 이름과 성이 포함됩니다.
Auth0 문서에서 범위 주제에 대해 자세히 알아보세요.
위 정보는 매우 중요하므로 최소한 처음 로그인할 때 해당 데이터를 애플리케이션의 테이블에 복사해야 합니다.
그렇게 하려면 auth0_controller에서 요청-응답의 내용을 사용해야 합니다. 특히 callback에서 행동:
해시를 자세히 살펴보고 실험하려면 리디렉션 전에 중단점을 사용하세요.
우리는 일반적으로 이메일 주소도 원합니다. 이를 얻으려면 범위를 업데이트하면 됩니다:
애플리케이션 서버를 다시 로드하고 로그인 단계를 거친 후 애플리케이션에 추가 정보에 대한 액세스 권한을 부여해야 합니다.
이제 callback에서 이와 같은 작업을 수행할 수 있습니다. 행동:
이를 통해 사용자에 대한 최신 로컬 프로필을 확보할 수 있습니다.
세션에 관한 한마디
세션은 Ruby on Rails 애플리케이션의 특수 해시입니다. 컨트롤러와 뷰에서 액세스할 수 있고 각 방문자마다 고유한 제한된 저장 공간이 있습니다.
세션을 "열고" "닫을" 수 있습니다. 특정 데이터 세트가 필요한 경우 세션이 열려 있는지 결정할 수 있습니다. 데이터가 없으면 닫힙니다.
Auth0 컨트롤러에서 다음 줄을 기억하세요:
첫 번째는 raw_info에 값을 씁니다. 세션 해시에 대한 해시 키이고, 두 번째 키는 세션 해시만 지웁니다.
그런 다음 ApplicationHelper에서 다음 도우미 메서드를 정의할 수 있습니다. :
보안 문제
이제 이것을 컨트롤러의 관심사로 활용해 보겠습니다. 아이디어는 private_controller와 같이 사용자가 로그인해야 액세스할 수 있는 컨트롤러를 정의하는 것입니다. .
다음과 같은 우려사항 파일을 작성할 수 있습니다:
그런 다음 컨트롤러에서 다음과 같이 사용할 수 있습니다:
방문자가 로그인하지 않은 상태에서 /private/index을 열려고 시도하는 경우 페이지로 이동하면 자동으로 사이트 루트로 리디렉션됩니다.
다른 제공업체와의 통합
Auth0을 통해 여러 공급자를 이용할 수 있습니다. 그러나 Google이 기본값으로 정의되어 있습니다. 많은 기업에서는 그것만으로도 충분합니다.
더 많은 제공업체가 필요한 경우 인증으로 이동하세요. Auth0의 관련 테넌트 메뉴와 소셜 메뉴 추가 공급자를 설정할 수 있는 하위 메뉴입니다.
Auth0을 사용하여 다단계 인증(MFA)을 구성할 수도 있다는 점도 주목할 가치가 있습니다.
해당 구성 단계를 제외하고 프로세스는 동일하게 유지됩니다. 우리 애플리케이션은 방문자가 인증되었음을 증명하기 위해 방문자 데이터만 반환합니다.
승인을 향한 길
이제 사용자를 인증하고 콜백을 통해 해당 정보를 애플리케이션에 보낼 수 있습니다. 우리는 해시에서 사용자의 이메일 주소를 가져오고 데이터베이스에서 관련 사용자를 찾는 방법을 이미 살펴보았습니다.
여기에서 승인 정책을 정의할 수 있습니다.
Pundit은 인증 정책을 정의하고 사용하는 데 탁월한 선택이지만 사용자 역할 확인에 의존합니다.
role 사용 사실 속성이 가장 쉬운 방법입니다. Rails 콘솔이나 애플리케이션의 백엔드 인터페이스에서 사용자를 생성할 때 사용자가 처음 로그인을 시도하기 전에 이를 입력할 수 있습니다.
또는 관리자의 이메일 목록을 가져와 사용자를 생성할 때 사용자의 이메일을 목록과 일치시킬 수 있습니다.
그게 전부입니다!
우리가 다룬 내용
이 글에서는 다음을 설정했습니다:
- Auth0의 테넌트 및 애플리케이션
- Ruby on Rails 애플리케이션의 Auth0 관련 gem
- 애플리케이션의 경로 및 보기
그러면 우리는:
- 세션의 개념을 검토하고 사용 방법을 살펴보았습니다.
- 사용자가 로그인했는지 확인하는 기본 도구 생성
- 로그인 요구 사항 뒤에 있는 컨트롤러를 보호하기 위해 컨트롤러 문제를 추가했습니다.
- 사용자를 자신의 역할에 연결하는 방법을 살펴보았습니다.
Auth0 및 기타 인증 공급자는 많은 코드를 작성하지 않고도 Ruby on Rails 애플리케이션에 최첨단 인증을 통합하는 데 도움을 줄 수 있습니다. 자체 인증 레이어 구현에 의존하거나 심지어 Devise와 같은 gem을 사용하는 것보다 훨씬 더 나은 옵션인 경우가 많습니다.
즐거운 코딩 되세요!
추신 Ruby Magic 게시물이 보도되는 즉시 읽으려면 Ruby Magic 뉴스레터를 구독하고 단 하나의 게시물도 놓치지 마세요!
토마스 리불레
객원 저자인 Thomas는 프랑스에 거주하는 백엔드 컨설턴트이자 클라우드 인프라 엔지니어입니다. 그는 13년 넘게 스타트업 및 회사와 협력하여 팀, 제품 및 인프라를 확장해 왔습니다. 그는 또한 프랑스의 GNU/Linux 잡지와 그의 블로그에 여러 차례 게재되었습니다.
Thomas Riboulet의 모든 기사