Laravel Passport는 oAuth2를 사용합니다. 사용자 토큰을 생성하고이를 사용하여 인증하는 것만 큼 간단하지 않습니다. oAuth2에는 토큰 교환이라고하는 또 다른 단계가 필요합니다.
Facebook으로 웹 사이트에 로그인 할 때 oAuth2 프로세스가 작동하는 것을 볼 수 있습니다. 페이스 북으로 로그인 버튼을 클릭하면 페이스 북으로 보내지고 계정에 대한 앱 액세스 (보통 계정의 특정 부분, a.k.a scopes
)를 확인하거나 거부하라는 대화 상자가 나타납니다.
해당 웹 사이트는 Facebook 계정을 소유하고 있으며 client ID
과 client secret
이 있습니다. 이 단추를 클릭하면 웹 사이트에서 Facebook으로 사용자의 권한과 인증 코드를 얻기 위해 페이스 북으로 연결됩니다. 웹 사이트는 client ID
, 요청 된 사용 권한 (scopes
), 임의로 생성 된 세션 상태 (나중에 확인할 수 있음) 및 대화 상자가 표시된 Facebook으로 리디렉션 할 URL을 전달합니다.
동의하면 Facebook에서 authorization code
을 생성하고 세션 상태 (웹 사이트에서 요청을 확인할 수 있음) 및 승인과 함께 웹 사이트 (지정한 리디렉션 URL)로 돌아 오는 것을 보냅니다. 암호.
웹 사이트의 백엔드에서 access token
에 대한 인증 코드를 교환하도록 Facebook에 요청하고 client ID
및 client secret
을 제공하므로 Facebook에서 인증 여부를 확인할 수 있습니다. 그런 다음 Facebook은 access token
및 만료 시간으로 응답합니다.
이제 웹 사이트에서 액세스 토큰을 사용하여 계정에 액세스하여 요청한 정보 (예 : 로그인 용 전자 메일 주소)를 가져올 수 있습니다.
이 과정을 건너 뛰고 사용자가 전체 리디렉션 흐름을 따라야하는 필요는 없습니다. 이렇게하려면 (적어도 Passport에서) 암호 부여 클라이언트가 필요합니다. 이것은 대개 oAuth2를 사용하여 API를 인증하는 경우 수행 할 작업입니다.
과정은 여기에 암호를 부여 클라이언트를 생성하는 것입니다 : 데이터베이스에서
php artisan passport:client --password
, 당신은 oauth_clients
테이블, 클라이언트 ID 및 암호를 사용하여 암호를 부여 클라이언트에서 찾을 수있을 것이다. API (예 : 모바일/휴대 전화 앱)를 사용하는 사용자에게이 정보를 제공해야합니다.
사용자가 로그인하기를 원할 때 API 사용자 (이 경우 Postman)는 사용자의 자격 증명 (사용자 이름/비밀번호)과 비밀번호 부여 클라이언트의 클라이언트 ID 및 비밀번호를 제공해야합니다. Passport에게 암호 부여를 통해 권한을 부여한다고 알려주는 것도 필요합니다.
워드 프로세서에 주어진 예는 다음과 같습니다
$response = $http->post('http://your-app.com/oauth/token', [
'form_params' => [
'grant_type' => 'password',
'client_id' => 'client-id',
'client_secret' => 'client-secret',
'username' => '[email protected]',
'password' => 'my-password',
'scope' => '',
],
]);
성공, 여권는 200 응답을 반환하고 액세스 토큰을 포함하는 일부 JSON 및 새로 고침 토큰을 반환합니다. 액세스 토큰을 사용하여 사용자의 계정에 액세스하고 새로 고침 토큰을 사용하여 새 액세스 토큰을 얻습니다 (사용자가 다시 로그인하지 않아도 됨).
권한 부여 헤더에서 무기명으로 제공해야하는 것은이 액세스 토큰입니다.
정말 고맙습니다. 완벽하게 설명했고 현재 작동 중입니다! 내 질문은 지금, 암호 부여를 사용하여 로그인 해야하는 모든 사용자에게 제공하는 client_id 및 client_secret 안전합니까? 또는 각 사용자에 대해 개별 client_id 및 client_secrets를 만들어야합니까? – fightstarr20
모든 사용자에 대해 client_id와 client_secret을 공유하는 것이 안전합니다. 왜냐하면 암호 부여가 이에 의존하지 않기 때문입니다 (현재 앱을 식별하는 것임). client_id 및 client_secret은 앱을 다른 앱과 공유하는 경우 중요합니다. 전의. Github에 Facebook 데이터가 필요하면 (Github은 사용자 자격 증명을 알 필요가 없습니다) Github이 Facebook 계정에 액세스 할 수 있도록 허용해야합니다. 이 경우 Github 앱을 Facebook에 먼저 등록해야합니다. – nmfzone
문제 없습니다. 사용 사례에 따라 다릅니다. 모바일 앱의 경우 API를 사용하려면 앱에 클라이언트 ID와 비밀번호가 저장되어 있어야합니다. 이 경우 비밀번호 부여 클라이언트를 사용하고 ID/비밀번호는 앱의 코드 또는 리소스에 저장됩니다. 따라서 앱의 모든 사용자는 기본적으로 앱에 저장된 동일한 클라이언트 ID와 비밀번호를 사용하여 인증됩니다. 또는 Facebook이하는 방식으로 사이트를 더 많은 서비스처럼 보이게하려면 소비자 당 하나의 고객 계정을 만드십시오. – Jonathon