SAML/Cognito/Laravel: Laravel에서 Cognito를 통해 ADFS 인증을 사용하는 방법

9056 단어 samlawslaravelcognito
우리는 Laravel 응용 프로그램을 ADF에 직접 통합하지 않고 AWS Cognito 사용자 풀을 중간자로 선택했다.이것은 내가 이 일을 할 때 한 노트다.

예상 프로세스와 논리


통합이 완료되면 이것이 바로 예상되는 인증 프로세스입니다.
  • 사용자가 Laravel 프로그램의 루트에 접근하려고 하는데, 이 프로그램은 Ensure Recognition ToAuthentications 중간부품에 의해 보호됩니다.
  • Laravel의 인증 중간부품은 인증되지 않은 요청을 포착하여 사용자를 로그인 경로로 안내합니다.
  • Cognoto의 위탁 관리 UI는 사용자에게SAML/ADFS 로그인 흐름으로 로그인하고 권한 수여 코드를 사용하여 /saml/login로 방향을 바꾸라고 알린다.
  • /saml/login 루트의 논리적 인증 코드를 받아AWS Cognito에 들어가access 영패로 교환하고 이 영패는 사용자의 세션 데이터에 삽입됩니다.또한 Laravel 데이터베이스에 사용자를 만들어 Laravel에 로그인합니다.그리고 그들은 처음 요청한 페이지로 다시 지정되었다.
  • 이후의 모든 새 페이지 요청에서 Laravel의 Authenticate 중간부품은 세션 영패를 검사해서 현재 유효한 세션이고 세션이 인증된 사용자에 속하는지 확인합니다.우리custom Ensulto Authentications 중간부품은 세션 데이터의access 영패를 검사하고, Cogito를 사용하여 검사합니다.만약 그렇다면 사용자는 계속할 수 있습니다.만약 그렇지 않다면, Google은 Laravel 사용자의 리셋 카드를 사용하여 Cognito에서 새로운 접근 카드를 가져오거나 취소합니다.
  • 코니토


    이 부분은 상대적으로 간단하다. AWS에서 제공하는 레이아웃은 양호하지만, 만약 당신이 보기보다 읽는 것을 더 좋아한다면, 나도 그것을 상세하게 소개할 것이다. 특히 나의 예에서, 우리는 기존의 ADFS 서버를 통합해야 한다.
  • AWS 계정이 필요합니다.로그인한 후 Cognito 콘솔로 이동하여 새 사용자 풀을 만듭니다.
  • 이름을 지어주고'기본값 보기'옵션으로 만든 다음 바로 창설 탱크에 들어갑니다.
  • Cogito 메뉴의 응용 프로그램 클라이언트 옵션을 사용하여 응용 프로그램 클라이언트를 추가합니다.이는 Cogntio에 대한 Laravel 응용 프로그램을 나타냅니다.그것의 이름을 주고 영패가 만료되면 기본값으로 보존합니다. (필요하면 나중에 변경할 수 있습니다.)"클라이언트 기밀 생성"상자를 선택 취소하고 "응용 프로그램 클라이언트 만들기"를 누르십시오.다음 화면에 표시된 응용 프로그램 클라이언트 ID를 확인합니다.
  • 다음으로 "응용 프로그램 통합"아래의 "도메인 이름"으로 가서 전 세계에서 유일한 도메인 이름 접두사를 입력한 다음 "변경 사항 저장"을 누르십시오.
  • 이제 ADFS 서버를 관리하는 사람과 이야기할 시간입니다.ADFS 메타데이터가 필요합니다. 이 메타데이터는 사용하려는 서버에 고유합니다.이것은 URL에서 왔는데, 그 끝은 유사하다. federationmetadata/2007-06/federationmetadata.xml다운로드하여 저장하거나 다음에 Cognito에 전달할 URL만 저장할 수 있습니다.
  • Cognito 메뉴의 "Federation"아래에 있는 "Identity providers"로 이동합니다.표시되는 옵션에서 "SAML"을 선택하고 다음 메뉴에서 메타데이터 파일 또는 URL을 제공합니다.'공급자 이름' 은 당신이 좋아하는 어떤 이름이든 참고할 수 있습니다.
  • "응용 프로그램 클라이언트 설정"을 되돌려줍니다. 이전에 설정한 응용 프로그램 클라이언트를 볼 수 있습니다.이 옵션을 사용하면 SAML 인증 프로그램 (IdP) 을 선택하기만 하면 됩니다.콜백 URL(Call back URL)에서는 응용 프로그램에서 SAML 로그인을 처리하는 데 사용할 URL을 제공합니다.예를 들어, 이 값은 https://mylaraveldashboard.com/saml/login일 수 있습니다.참고:
  • 나중에 응용 프로그램에서 이 문제를 처리하는 URL을 변경하려면 이 값을 업데이트해야 합니다.절차에서 잠시 후에 영패를 교환할 때 이것도 일종의 암호로 사용할 수 있다.Cognito는 토큰 요청에서 제공한 리디렉션 URL이 이 값과 일치하는지 확인합니다. 일치하지 않으면 오류가 발생합니다.
  • 로컬 컴퓨터에서 테스트를 수행하려면 콜백 URL을 http://localhost:8000/saml/login로 설정하십시오(감사합니다.
    이 점을 지적해 주셔서 감사합니다.
  • 그리고'허용된 OAuth 흐름'부분에서'수권 코드 수권'과'은식 수권'을 선택합니다.다음에 모든 허용된 OAuth 역할 영역을 확인하십시오. (저는 아이폰을 사용하지 않습니다. 왜냐하면 저희 프로그램은 그것을 필요로 하지 않지만, 이것은 당신에게 달려 있습니다.)변경 내용 저장을 클릭합니다.
  • 속성 매핑은 다음 단계입니다.이것은 메뉴의'Federation'(연합)에서 찾을 수 있다.여기서 Google은 ADF에서 받은 사용자에 대한 정보를 Google 프로그램에 공개하기를 희망합니다.이것들은 모두 단도직입적이다. 당신은 아래의 정보를 입력해야 한다. 이것은 당신이 어떤 속성을 필요로 하는지에 달려 있다.이 예에서, 우리는 이메일, 성명, 성씨를 받았다.

  • 응용 프로그램 클라이언트 설정을 되돌려 아래로 스크롤하고 위탁 관리 사용자 인터페이스 옵션을 찾습니다.이 링크를 클릭하고 가져온 URL을 복사합니다.이것은 당신의 로그인 페이지입니다!걱정하지 마십시오. Cognito 메뉴에서 CSS를 변경할 수 있습니다.
  • 마지막으로 ADFS 담당자가 애플리케이션을 활성화해야 합니다.그들은 this metadata file AWS의 문서에서 얻을 수 있고, 당신의 위탁 관리 사용자 인터페이스 URL도 아직 시간이 필요합니다.죄송하지만, 저는 여기에서 더 많은 정보를 제공할 수 없습니다. 프로그램을 설정할 때, 프로그램이 제 통제 범위를 넘어섰습니다.
  • 라빌

  • 코드를 작성하기 전에 먼저 우리의 것을 봅시다.env 파일에는 우리가 필요로 하는 모든 정보가 포함되어 있습니다.내 것은 이렇게 보인다.
  • COGNITO_APP_ID=(this is the code that you noted earlier while setting up an app for your user pool)
    COGNITO_APP_REGION=eu-west-2 (or whatever your region is)
    COGNITO_HOSTED_UI_URL=(you visted this url earlier, it's your sign in page)
    COGNITO_REDIRECT_URL=(this is the one you provided to the app client settings on cognito, and should be a link to a page in your application)
    COGNITO_API_BASE_URI=(this will look something like https://[user-pool-chosen-domain-name].auth.[aws-region].amazoncognito.com)
    
  • 현재 우리는 composer가 제공하는 AWS PHP SDK 패키지가 필요하기 때문에 명령줄에서 실행composer require aws/aws-sdk-php합니다.
  • 우리가 필요로 하는 노선을 설정하라고 합니다.다음은 routes/web.php 파일의 본문입니다.
  • Route::middleware(['auth', 'cognito'])->group(function () {
        Route::get('/', function () {
            return view('welcome');
        })->name('welcome');
    
        // Any other pages you need to protect behind authentication go here
    });
    
    Route::get('/saml/login', [LoginController::class, 'samlLogin']);
    
  • 로그인 컨트롤러.php는 다음입니다.이것은 관리할 것이다. 네가 알아맞히면 로그인 흐름이다.여기서, 우리는SAML을 사용하여 사용자를Cognito에 로그인할 것입니다. 확인되면, 그들의 상세한 정보를 데이터베이스에 저장하고, 그들도 거기에 로그인할 것입니다.Google은 그들의 Cognito 액세스 토큰을 Larvel 세션에 배치하고, 그들의 리셋 토큰을 데이터베이스에 저장할 것입니다.Here's a gist 내 Login Controller의 기본 버전이 포함되어 있습니다.
  • 다음에 모든 요청이 응용 프로그램과 함께 도착할 때 인증할 중간부품을 만들어야 합니다.이렇게 하면 사용자가 ADFS 서버에서 제거되면 애플리케이션에 대한 추가 액세스가 즉시 거부됩니다.그럼 명령을 실행합시다php artisan make:middleware EnsureCognitoAuthenticates.이것은 우리가 업데이트할 수 있도록 관련 파일을 만들 것이다.(으)로 변경해야 합니다.app/Http/Kernel.php수조에 routeMiddleware 다음에 'cognito' => \App\Http\Middleware\EnsureCognitoAuthenticates::class,를 추가한다.다음은 중간부품 자체를 작성하는 것이다.나는 간략한 버전과 posted it as a gist here을 직접 만들었다.
  • If you want to know more about these AWS API endpoints we're calling, their documentation is available here: https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-userpools-server-contract-reference.html

  • 열기auth - Laravel이 요청한 모든 실행에 대한 기본 인증입니다.app/Http/Middleware/Authenticate.php 기능이 사용자가 로그인해야 할 때 원하는 페이지로 바뀌는지 확인하십시오.이것은 이름이 지정된 로그인 경로이지만 관리되는 UI의 URL을 되돌려 한 걸음 건너뛸 수 있습니다.내 유효성 검사 중간부품은 다음과 같습니다.
  •     /**
         * Get the path the user should be redirected to when they are not authenticated.
         *
         * @param  \Illuminate\Http\Request  $request
         * @return string|null
         */
        protected function redirectTo($request)
        {
    
            $attemptedUrl = $request->fullUrl();
    
            if (!$request->expectsJson()) {
                return route('login', ["desired_url" => urlencode($attemptedUrl)]);
            }
        }
    
    
  • 응용 프로그램은 이제 테스트할 수 있습니다!
  • 결론


    따라서 Laravel 및 AWS Cognito와 함께 실행되는 SAML/ADFS 인증 체험이 가능합니다.도움이 되었으면 좋겠습니다.
    나는 개선할 수 있는 많은 방법이 있다고 믿는다. 나에게 너의 생각을 말해 줘.

    좋은 웹페이지 즐겨찾기