5분 안에 PHP 응용 프로그램에 인증 추가

17157 단어 phpwebdevtutorialoauth
당신은 다른 사용자 이름과 암호 데이터베이스를 만드는 것을 두려워하는 인증을 추가해야 하는 응용 프로그램을 구축하고 있는 것을 발견했습니까?본고에서 간단한 PHP 프로그램에 인증Okta을 5분 안에 추가하는 것이 얼마나 쉬운지 보여 드리겠습니다.Okta의 간단한 OAuth API를 이용하여 우리는 Okta를 통해 하드 부분을 처리하여 사용자가 관련된 대부분의 도전을 쉽게 해결할 수 있다.
이 강좌를 배우려면 계정sign up for free이 없으면 먼저 Okta 개발자 계정이 필요합니다. 완성되면 여기로 돌아가십시오.이 예에서 우리는 외부 PHP 라이브러리나 의존 항목을 사용하지 않습니다. 단지 간단하게 보기 위해서입니다.
PHP 파일부터 응용 프로그램의 로그인/로그아웃 상태를 보여 줍니다.그리고 우리는 통합Okta API을 통해 사용자의 신분을 검증하고 사용자가 로그인한 후에 그들의 사용자 이름을 찾을 것이다.이 안내서를 사용하여 실제 응용 프로그램에 인증을 추가할 수 있습니다.

샘플 PHP 응용 프로그램 설정


완료된 항목으로 이동하려면 source code on GitHub 을 참조하십시오.이 글은 완성된 프로젝트에서 코드를 구축하고 이를 점차적으로 해석했다.
다음 내용을 포함하는 새 파일 index.php 을 만듭니다.이것은 사용자의 로그인 여부(PHP 세션에 사용자 이름이 있는지)에 따라 응용 프로그램의 두 가지 다른 보기를 설정합니다.
<?php
// Begin the PHP session so we have a place to store the username
session_start();

// If there is a username, they are logged in, and we'll show the logged-in view
if(isset($_SESSION['username'])) {
  echo '<p>Logged in as</p>';
  echo '<p>' . $_SESSION['username'] . '</p>';
  echo '<p><a href="/?logout">Log Out</a></p>';
  die();
}

// If there is no username, they are logged out, so show them the login link
if(!isset($_SESSION['username'])) {
  $authorize_url = 'TODO';
  echo '<p>Not logged in</p>';
  echo '<p><a href="'.$authorize_url.'">Log In</a></p>';
}

이 간단한 프레임워크를 만들면 인증을 추가할 수 있습니다.이 프로그램은 현재 세션 변수에서 사용자 이름을 찾고 설정할 때 로그인한 사용자를 고려합니다.
다음은 Okta를 API로 호출할 때 사용할 간단한 함수를 추가합니다.이 함수는 HTTP 요청을 보내고 JSON 디코딩 응답을 반환합니다.그것은 URL과 선택할 수 있는 매개 변수 그룹을 받아들인다.매개변수가 있으면 HTTP 바디로 사용할 POST 요청이 전송됩니다.그렇지 않으면 지정된 URL에 GET 요청이 전송됩니다.현재 진행 중인 모든 API 호출은 JSON 응답체를 생성하기 때문에 이 함수는 JSON 응답을 디코딩하고 결과 대상을 되돌려줍니다.
function http($url, $params=false) {
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  if($params)
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
  return json_decode(curl_exec($ch));
}

Okta에서 OAuth 응용 프로그램 만들기


자세한 내용을 알기 전에 Okta 개발자 계정을 구성하여 클라이언트 ID와 API 대화에 사용할 기밀을 확보해야 합니다.Okta 개발자 계정의 응용 프로그램 섹션에서 응용 프로그램 추가 * 를 클릭한 다음 * * 웹 을 선택합니다.기본 응용 프로그램 설정에 대한 유일한 변경 사항은 리셋 URL을 http://localhost:8080/ 로 변경하는 것입니다. 이 PHP 파일에서 전체 흐름을 작성하기 때문입니다.

완료를 클릭하면 새 고객 ID와 암호를 얻을 수 있는 다음 화면으로 이동합니다.이 두 값을 다음 변수에 복사하여 PHP 파일의 맨 위에 블록을 추가합니다session_start().
$client_id = '';
$client_secret = '';
$redirect_uri = 'http://localhost:8080/';

권한 부여 서버 메타데이터 URL을 찾아야 합니다.상단 메뉴에서 API-> 인증 서버를 선택합니다.목록에 권한 부여 서버 default 를 보십시오.이 옵션을 클릭하고 메타데이터 URI를 클라이언트 아래로 복사하여 행을 재정의합니다.
$metadata_url = 'https://{yourOktaOrg}/oauth2/default/.well-known/oauth-authorization-server';
// Fetch the authorization server metadata which contains a few URLs
// that we need later, such as the authorization and token endpoints
$metadata = http($metadata_url);

로그인 URL 생성


이제 로그인 URL을 구축할 준비가 되었습니다. 그곳에서 사용자에게 인증을 보낼 수 있습니다.다음 코드로 회선을 교체합니다$authorize_url = 'TODO';.
  // Generate a random state parameter for CSRF security
  $_SESSION['state'] = bin2hex(random_bytes(5));

  // Build the authorization URL by starting with the authorization endpoint
  // and adding a few query string parameters identifying this application
  $authorize_url = $metadata->authorization_endpoint.'?'.http_build_query([
    'response_type' => 'code',
    'client_id' => $client_id,
    'redirect_uri' => $redirect_uri,
    'state' => $_SESSION['state'],
    'scope' => 'openid',
  ]);
이 코드는 OAuth 인증 코드 흐름의 시작을 설정합니다.이 매개 변수에 대한 더 자세한 정보를 알고 싶다면, 이전에 이 블로그에 권한 수여 코드 흐름에 관한 글을 썼습니다: What is the OAuth 2.0 Authorization Code Grant Type?
우리는 지금 이미 시험적으로 사용할 충분한 제품이 있다.명령줄에서 index.php 파일이 있는 폴더로 이동한 다음 PHP 서버를 시작합니다.
php -S 127.0.0.1:8080

이제 브라우저 http://127.0.0.1:8080/ 에서 이 페이지에 액세스하면 로그인 메시지가 표시됩니다.

당분간 링크를 클릭하지 마십시오. 왜냐하면 우리는 여전히 리셋 처리와 접근 영패를 설정해야 하기 때문입니다.

OAuth 리디렉션 처리


사용자가 로그인 URL을 클릭하면 Okta 인증 서버로 전송됩니다.권한 수여 서버는 로그인을 요청한 다음 임시 권한 수여 코드를 생성하고 사용자를 이 프로그램으로 다시 지정합니다.사용자가 로그인했는지 확인하기 위해서, 프로그램은 Okta의 권한 수여 서버에서 이 임시 권한 수여 코드를 액세스 영패로 교환해서 유효한지 확인해야 합니다.
클라이언트 ID 설정 줄과 로그아웃 보기를 보여주는 부분 사이에 접근 영패 교환 인증 코드를 처리하는 새로운 부분을 추가합니다.
우선, 우리는 검색 문자열에 권한 수여 코드 검사를 추가합니다.당신의 코드는 지금 이렇게 될 것입니다.
// ...
$metadata = http($metadata_url);

if(isset($_GET['code'])) {

  // TODO: we'll work on filling out this section next

}

if(!isset($_SESSION['username'])) {
// ...

이 새 부분에서 우리는 방금 추가한 "TODO"주석을 대체하기 위해 오류 검사를 추가합니다.우리는 우선 권한 수여 서버가 사용자가 로그인을 시작할 때 설정한 상태 파라미터와 같은 상태 파라미터를 되돌려 주었는지 검사할 것이다.
  if($_SESSION['state'] != $_GET['state']) {
    die('Authorization server returned an invalid state parameter');
  }

  if(isset($_GET['error'])) {
    die('Authorization server returned an error: '.htmlspecialchars($_GET['error']));
  }

권한 수여 서버도 이곳에서 오류를 되돌릴 수 있기 때문에 이런 상황이 발생하면 오류를 표시할 것입니다.
다음은 URL에서 인증 코드를 가져와 영패 단점에서 방문 영패로 교환해야 합니다.이를 위해 메타데이터 응답의 토큰을 사용하고 API 호출에 클라이언트 ID와 암호를 포함합니다.
  $response = http($metadata->token_endpoint, [
    'grant_type' => 'authorization_code',
    'code' => $_GET['code'],
    'redirect_uri' => $redirect_uri,
    'client_id' => $client_id,
    'client_secret' => $client_secret,
  ]);

  if(!isset($response->access_token)) {
    die('Error fetching access token');
  }

만약 모든 것이 순조롭다면, 우리는 $response 대상에서 방문 영패를 받을 것이다.실제로 로그인자를 찾아내는 것 외에 영패에 접근할 필요가 없기 때문에 어디에도 저장하지 않습니다.반대로, 우리는 그것을 사용하여 영패 내성 단점에 요청을 할 것이다.
  $token = http($metadata->introspection_endpoint, [
    'token' => $response->access_token,
    'client_id' => $client_id,
    'client_secret' => $client_secret,
  ]);

  if($token->active == 1) {
    $_SESSION['username'] = $token->username;
    header('Location: /');
    die();
  }

이 코드는 접근 영패를 가져와 클라이언트 증빙서류와 함께 영패 내 노드에 보냅니다.내성 단점은 우리에게 로그인자의 사용자 이름을 알려 준다.만약 영패가 활성화되어 있다면, 우리는 세션에서 사용자 이름을 설정한 다음, 홈 페이지로 다시 지정합니다.현재 사용자 이름이 세션에 있습니다. 저희 응용 프로그램은 로그인한 사용자를 고려했습니다. 사용자 이메일 주소가 있는 로그인 페이지를 보았습니다!

간단한 PHP 응용 프로그램에 인증을 추가하는 것이 얼마나 쉬운지 설명하는 유용한 예가 되기를 바랍니다!이것은 아주 간단한 예입니다. 실제로 응용 프로그램의 기능이 더욱 강하고 여러 파일에 더 잘 조직될 수 있습니다.단, 여기서 배운 지식을 다른 프레임워크나 사용 중인 용례에 적용할 수 있어야 합니다!
이 응용 프로그램의 전체 소스 코드를 GitHub 에서 볼 수 있습니다.

한층 더 읽다


OAuth에 대한 더 많은 정보와 강좌는 저희의 다른 블로그 게시물을 보십시오!
  • What is the OAuth 2.0 Authorization Code Grant Type?
  • What is the OAuth 2.0 Implicit Grant Type?
  • Build a Basic CRUD App with Symfony 4 and Vue
  • Get Started with Spring Boot, OAuth 2.0, and Okta
  • 여느 때와 마찬가지로, 우리는 당신이 이 문장에 관한 소식이나 기타 어떤 일을 듣고 싶습니다.댓글이나 트위터에 연락주세요!

    좋은 웹페이지 즐겨찾기