OAuth를 사용하여 기존 PHP 비즈니스 애플리케이션 보호
두 부분으로 구성된 이 시리즈에서는 사용자 데이터 저장소를 사용하여 현대 인증 시스템을 대체하기 위해 (가짜) 업무 라인 PHP 프로그램을 업데이트할 것입니다.두 번째 부분에서는 계정과 개요 데이터를 남겨진 데이터 저장소에서 FusionAuth로 이전하는 두 가지 방법을 이해할 수 있습니다.
코드는 FusionAuth GitHub repository에서 찾을 수 있기 때문에 복제할 수도 있고, 원한다면 계속할 수도 있다.
선결 조건
시작하기 전에 너는 몇 가지 일을 준비해야 한다.
자체 제작 auth 시스템을 사용하여 기존 PHP 응용 프로그램을 소개합니다.
이 글은 업그레이드될'가짜'응용 프로그램에 인증 시스템이 있는데, 그것은 마침 국산이다.다음과 같은 문제가 있습니다.
insecure-legacy-app
분기를 보고 이 가짜 응용 프로그램을 볼 수 있습니다.당신도 할 수 있습니다 view it online.기본적으로 색인 페이지와 로그인 및 로그아웃 방법이 있습니다.모든 돈을 버는 업무 논리는 재고 갱신, 고객 돕기, 공급업체 비용 계산 등 독자들에게 연습으로 남겨진다.이 응용 프로그램이 현대적이라고 가정하면
composer
의존항을 관리할 수 있다. 설령 많은 오래된 PHP 응용 프로그램이 이런 도구를 사용하지 않는다 하더라도.이 강좌는 매우 전면적이지만 PHP 응용 프로그램을 현대 의존 관계 관리 시스템으로 전환하는 것을 포함하기에는 부족하다.하지만 나는 이 도구들을 전적으로 지지할 것이다.그것들은 매우 유용하다.이것은 이 응용 프로그램의 입구점
index.php
이다.<?php
require __DIR__. '/config.php';
require __DIR__. '/common.php';
require __DIR__. '/vendor/autoload.php';
?>
Welcome to the application.
<?php if (!$_SESSION['user']) { ?>
<?php if ($_SESSION['error']) { ?>
<br/><span style="color: red;"><?php echo $_SESSION['error']; ?></span><br/>
<?php } ?>
<form action="/authenticate.php">
Username: <input type="text" name="email"/> <br/>
Password: <input type="password" name="password"/> <br/>
<input type="submit" value="Log in"/>
</form>
<?php } ?>
<?php if ($_SESSION['user']) { ?>
You are logged in.<br/>
<form action="/logout.php">
<input type="submit" value="Log out"/>
</form>
<?php } ?>
사용자가 로그인하면 다음과 같이 authenticate.php
에 게시됩니다.<?php
require __DIR__. '/config.php';
require __DIR__. '/common.php';
require __DIR__. '/vendor/autoload.php';
if ($_REQUEST['email'] && $_REQUEST['password']) {
if (auth($_REQUEST['email'], $_REQUEST['password'])) {
// in reality, you'd load from a database
$user = [];
$user['email'] = $_REQUEST['email'];
$user['favoriteColor'] = 'blue';
$_SESSION['user'] = $user;
unset($_SESSION['error']);
} else {
$_SESSION['error'] = 'Unable to authenticate';
}
}
header("Location: /");
?>
authenticate.php
호출auth
함수, 이 함수는 사용자가 정확한 증거를 제공했는지 확인합니다.일반적으로 이것은 조회user
표를 통해 제공된 암호를 산열하고 저장된 산열과 비교할 수 있다.이 가짜 응용 프로그램에서는 비밀번호password
와 사용자 이름만 사용할 수 있습니다.복제를 다시 시작하면 이 응용 프로그램을 실행할 수 있습니다.
php -S 0.0.0.0:8000
이 응용 프로그램의 실제 응용 프로그램을 보려면 http://localhost:8000
을 방문하십시오.로그인하기 전에 다음을 볼 수 있습니다.로그인하면 다음 화면이 표시됩니다.
현재, 당신은 이미 기초 지식을 알고 있습니다. 우리는 현대 인증 프로토콜: OAuth를 사용하기 위해 응용 프로그램을 계속 업데이트할 것입니다.
FusionAuth에서 애플리케이션 구성
남아 있는 PHP 응용 프로그램에 대응하기 위해 FusionAuth에서 응용 프로그램을 구성해야 합니다.닉네임에 대응하기 위해'ATM'이라고 부르자.응용 프로그램과 사용자를 모두 보유할 수 있습니다.
관리 사용자 인터페이스에서 응용 프로그램으로 이동하여 새 응용 프로그램을 만듭니다.OAuth 탭으로 이동하여 인증 코드가 선택되어 있는지 확인합니다.리디렉션 URL
http://localhost:8000/oauth-callback.php
을 추가합니다.마지막으로, 그것은 이렇게 해야 한다.녹색 돋보기를 사용하여 응용 프로그램을 보고 OAuth 구성 섹션으로 아래로 스크롤합니다.다음에 사용될
Client ID
및 Client Secret
값을 주의하십시오.응용 프로그램을 저장하고 응용 프로그램에 등록된 사용자를 추가합니다.Users로 이동하여 사용자를 추가합니다.그런 다음 등록 탭으로 이동하여 ATM 응용 프로그램에 등록하여 계속 로그인하고 작업을 완료할 수 있도록 합니다.
마지막으로, 당신은 세입자 식별자가 필요합니다.FusionAuth를 방금 설치했다면 세입자는 한 명뿐이지만 FusionAuth는 여러 세입자를 지원하며 수량은 필요에 따라 정할 수 있습니다.'세입자'로 이동하여'기본값'세입자의 id를 복사합니다.
이것이 FusionAuth 구성의 전부입니다.이제 PHP 응용 프로그램과 그것을 어떻게 변경하는지 봅시다.
OAuth를 사용하여 PHP 응용 프로그램을 업데이트하여 인증
"ATM"PHP 프로그램을 업데이트하기 위해서,composer를 사용하여 OAuth 라이브러리에 의존항을 추가합니다.
authenticate.php
논리를 사용하지 말고 FusionAuth로 방향을 변경합니다.다음은 새 프로세스의 다이어그램입니다.권한 수여 코드는 데이터 흐름을 부여한다.
이 절에서는 이러한 변화를 소개하지만, 환매 중인
auth-with-oauth
지점을 보면 이러한 변화를 볼 수 있다.당신도 할 수 있습니다 view it online.이러한 변경 사항은 인증 코드 인증을 사용하여 사용자가 인증을 받을 수 있도록 하고 OIDC 단점을 사용하여 사용자 데이터를 검색합니다.다음과 같이 파일
composer.json
을 업데이트합니다.{
"require": {
"league/oauth2-client": "^2.5"
}
}
이것은 하나well supported PHP OAuth client library를 도입할 것이다.이 라이브러리를 사용하면 FusionAuth와의 통합을 몇 줄로 줄일 수 있습니다. 이것은 저에게 매우 좋습니다.가능하다면, 도서관을 사용하는 것은 항상 좋은 생각이다.유니버설 공급자는 정상적으로 작동하지만, 이 라이브러리에도 다른 사용자 정의 공급자가 있습니다.새 종속성 설치:
composer install
위에 언급된 OAuth 기밀 정보와 임차인 식별자를 사용하여 config.php
파일을 설정해야 합니다.<?php
// definitely update
$client_id = '83767d78-2927-43fa-baef-b556d7c91c9a';
$client_secret = 'a_pOJZu8D3Fy7a8fVxlPkVa92HPlnUt8d8JfJmtJL5U';
$tenant_id = '30663132-6464-6665-3032-326466613934';
// update if you aren't running the app or FusionAuth in the default location
$redirect_uri = 'http://localhost:8000/oauth-callback.php';
$fa_url = 'http://localhost:9011';
새 파일index.php
은 다음과 같습니다.<?php
require __DIR__. '/config.php';
require __DIR__. '/common.php';
require __DIR__. '/vendor/autoload.php';
$provider = new \League\OAuth2\Client\Provider\GenericProvider([
'clientId' => $client_id,
'clientSecret' => $client_secret,
'redirectUri' => $redirect_uri,
'urlAuthorize' => $fa_url.'/oauth2/authorize',
'urlAccessToken' => $fa_url.'/oauth2/token',
'urlResourceOwnerDetails' => $fa_url.'/oauth2/userinfo'
]);
// Get the state generated for you and store it to the session.
$_SESSION['oauth2state'] = $provider->getState();
?>
Welcome to the application.
<?php if (!$_SESSION['user']) { ?>
<br/>
<a href='<?php echo $provider->getAuthorizationUrl(); ?>'>Login</a>
<?php } ?>
<?php if ($_SESSION['user']) { ?>
You are logged in.<br/>
<form action="/logout.php">
<input type="submit" value="Log out"/>
</form>
<?php } ?>
이 변경을 통해 거친 로컬 데이터 저장소가 아니라 OAuth와 OIDC를 사용하여 인증을 하기 위해 이 프로그램을 업데이트했습니다.전체 authenticate.php
파일이 만료되었습니다.사용자가 로그인을 클릭하면 내부 데이터 저장소에 게시되지 않고 FusionAuth에서 관리되는 로그인 페이지로 안내됩니다.이것은 그들이 보게 될 것이다(기본적인 외관이지만 these pages can be themed:검증 후
oauth-callback.php
코드가 실행됩니다.보아하니 이렇다.<?php
require __DIR__. '/config.php';
require __DIR__. '/common.php';
require __DIR__. '/vendor/autoload.php';
$provider = new \League\OAuth2\Client\Provider\GenericProvider([
'clientId' => $client_id,
'clientSecret' => $client_secret,
'redirectUri' => $redirect_uri,
'urlAuthorize' => $fa_url.'/oauth2/authorize',
'urlAccessToken' => $fa_url.'/oauth2/token',
'urlResourceOwnerDetails' => $fa_url.'/oauth2/userinfo'
]);
if (empty($_GET['state']) || (isset($_SESSION['oauth2state']) && $_GET['state'] !== $_SESSION['oauth2state'])) {
if (isset($_SESSION['oauth2state'])) {
unset($_SESSION['oauth2state']);
}
exit('Invalid state');
}
try {
// Try to get an access token using the authorization code grant.
$accessToken = $provider->getAccessToken('authorization_code', [
'code' => $_GET['code']
]);
// Using the access token, we may look up details about the
// resource owner.
$resourceOwner = $provider->getResourceOwner($accessToken);
$_SESSION['user'] = $resourceOwner;
header("Location: /");
} catch (\League\OAuth2\Client\Provider\Exception\IdentityProviderException $e) {
// Failed to get the access token or user details.
exit($e->getMessage());
}
이 코드는 state
파라미터가 변하지 않는지 확인한 다음 code
파라미터를 사용하여 접근 영패 (일반적으로 JSON 웹 영패 또는 JWT) 를 검색하도록 요청합니다.그리고 접근 영패를 단점에 보여주고 이 단점은 사용자 데이터를 되돌려줍니다.세션에 저장되어 있으며, 사용자는 색인 페이지로 전송되며, 위에서 볼 때, 색인 페이지는 변하지 않습니다.그러나 응용 프로그램은 사용자가 인증을 통과했다는 것을 알고 있다.세션에
user
객체가 있으며 권한 부여 목적으로 확인할 수 있습니다.FusionAuth 사용자에게 역할을 추가하고 사용자의 역할에 따라 응용 프로그램 기능에 대한 액세스를 제어할 수도 있습니다.다음 단계
다행히도 이 프로그램을 중앙 데이터 저장소로 변환했습니다.새로운 사용자를 쉽게 관리하고 복잡성과 보안 위험을 중점 소프트웨어 패키지로 옮기는 등 중앙 집중식 인증 관리의 모든 이점을 얻을 수 있습니다.
이 절차는 새로운 사용자에게 매우 효과적이다.그러나 기존 사용자를 FusionAuth로 전환하는 방법은 무엇입니까?
아, 네, 그게 중요해요.완전히 독립적이고 곧 발표될 게시물의 주제가 될 만큼 중요하다.
Reference
이 문제에 관하여(OAuth를 사용하여 기존 PHP 비즈니스 애플리케이션 보호), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/fusionauth/securing-your-legacy-php-business-application-with-oauth-4efh텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)