Skip to main content

개요

Bluesky의 OAuth는 AT Protocol에 기반하고 있으며, GitHub나 Google 등 일반적인 Socialite 프로바이더와는 크게 다릅니다.
Bluesky의 OAuth는 다른 Socialite 프로바이더와는 구현이 근본적으로 다릅니다. DPoP(Demonstrated Proof of Possession)와 PAR(Pushed Authorization Requests) 엔드포인트를 사용합니다. client_secret은 불필요하고, 대신 비밀 키를 사용합니다.

일반 OAuth와의 차이

인증 흐름

설치와 설정

비밀 키 생성

먼저 비밀 키를 생성합니다. 이는 Bluesky에 등록하지 않고도 진행할 수 있습니다.
출력된 값을 .env에 복사합니다.
Bluesky의 경우 client_idclient_secret 등록이 불필요합니다. 비밀 키 설정만으로도 OAuth 인증을 사용할 수 있습니다.

기본 OAuth 스코프

패키지는 3가지 주요 사용 사례를 지원하는 기본 OAuth 스코프로 설정되어 있습니다.
  1. Socialite 로그인atproto, account:email, include:app.bsky.authViewAll로 사용자 인증과 이메일 액세스를 활성화합니다
  2. 게시include:app.bsky.authCreatePostsblob:*/*로 게시 작성과 이미지·동영상 업로드를 허용합니다
  3. DM 알림rpc:chat.bsky.convo.sendMessagerpc:chat.bsky.convo.getConvoForMembers로 알림용 다이렉트 메시지 전송을 활성화합니다
BLUESKY_OAUTH_SCOPE 환경 변수를 설정하여 스코프를 커스터마이즈할 수 있습니다.
이용 가능한 스코프의 상세는 AT Protocol Permission Requests 문서를 참조하세요.

로컬 개발

기본으로 http://localhosthttp://127.0.0.1:8000/이 설정되어 있으므로, 로컬 개발에는 추가 설정이 불필요합니다.

프로덕션 환경

라우트 이름 bluesky.oauth.redirect가 존재한다면 .env에 별도 설정은 불필요합니다. 기본 라우트 이름을 변경한 경우에는 설정합니다.

라우트 설정

콜백 라우트의 이름은 bluesky.oauth.redirect를 권장합니다. 패키지가 이 이름을 내부적으로 사용합니다.

로컬 개발에서의 콜백 처리

로컬 개발 중에는 Bluesky의 콜백 URL이 http://127.0.0.1:8000/으로 고정됩니다. 라우트 단위에서 분기 처리하면 편리합니다.

컨트롤러 구현

사용자 정보(OAuthSession)

$user->session으로 취득할 수 있는 OAuthSession의 주요 메서드를 소개합니다. 모든 속성을 확인하려면 toArray()를 사용합니다.

데이터베이스 설정

users 테이블에 Bluesky 고유의 컬럼을 추가합니다. DID가 Bluesky 사용자의 고유 식별자입니다.

OAuthSession의 재이용

세션에 저장한 OAuthSession을 사용해 API를 호출할 수 있습니다.
Job이나 Console 등 Laravel 세션을 사용할 수 없는 경우에는 DB에서 데이터를 취득해 OAuthSession을 구성합니다.

토큰 자동 갱신

리프레시 토큰은 한 번밖에 사용할 수 없으므로, 갱신 후에는 반드시 DB에 다시 저장해야 합니다. OAuthSessionUpdated 이벤트를 사용합니다.
리프레시 개시 시점에는 OAuthSessionRefreshing 이벤트도 발행됩니다. 이 시점에서 refresh_token이 무효화되므로, DB에서 삭제해 두면 안전합니다.

WithBluesky 트레이트

User 모델에 WithBluesky 트레이트를 추가하고 tokenForBluesky()를 구현하면, $user->bluesky()로 인증된 클라이언트를 취득할 수 있습니다.

client-metadata 커스터마이즈

패키지는 bluesky.oauth.client-metadatabluesky.oauth.jwks 라우트를 자동으로 정의합니다. 일반적으로 변경할 필요는 없지만, OAuthConfig로 커스터마이즈할 수 있습니다.

미인증 시의 동작

OAuthSession이 null이거나 리프레시 토큰이 없는 경우, Unauthenticated 예외가 throw되고 login 라우트로 리디렉트됩니다.
마지막 수정일 2026년 7월 13일