개요
Bluesky의 OAuth는 AT Protocol에 기반하고 있으며, GitHub나 Google 등 일반적인 Socialite 프로바이더와는 크게 다릅니다.일반 OAuth와의 차이
인증 흐름
설치와 설정
비밀 키 생성
먼저 비밀 키를 생성합니다. 이는 Bluesky에 등록하지 않고도 진행할 수 있습니다..env에 복사합니다.
Bluesky의 경우
client_id나 client_secret 등록이 불필요합니다. 비밀 키 설정만으로도 OAuth 인증을 사용할 수 있습니다.기본 OAuth 스코프
패키지는 3가지 주요 사용 사례를 지원하는 기본 OAuth 스코프로 설정되어 있습니다.- Socialite 로그인 —
atproto,account:email,include:app.bsky.authViewAll로 사용자 인증과 이메일 액세스를 활성화합니다 - 게시 —
include:app.bsky.authCreatePosts와blob:*/*로 게시 작성과 이미지·동영상 업로드를 허용합니다 - DM 알림 —
rpc:chat.bsky.convo.sendMessage와rpc:chat.bsky.convo.getConvoForMembers로 알림용 다이렉트 메시지 전송을 활성화합니다
BLUESKY_OAUTH_SCOPE 환경 변수를 설정하여 스코프를 커스터마이즈할 수 있습니다.
로컬 개발
기본으로http://localhost와 http://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를 호출할 수 있습니다.토큰 자동 갱신
리프레시 토큰은 한 번밖에 사용할 수 없으므로, 갱신 후에는 반드시 DB에 다시 저장해야 합니다.OAuthSessionUpdated 이벤트를 사용합니다.
OAuthSessionRefreshing 이벤트도 발행됩니다. 이 시점에서 refresh_token이 무효화되므로, DB에서 삭제해 두면 안전합니다.
WithBluesky 트레이트
User 모델에WithBluesky 트레이트를 추가하고 tokenForBluesky()를 구현하면, $user->bluesky()로 인증된 클라이언트를 취득할 수 있습니다.
client-metadata 커스터마이즈
패키지는bluesky.oauth.client-metadata와 bluesky.oauth.jwks 라우트를 자동으로 정의합니다. 일반적으로 변경할 필요는 없지만, OAuthConfig로 커스터마이즈할 수 있습니다.
미인증 시의 동작
OAuthSession이 null이거나 리프레시 토큰이 없는 경우, Unauthenticated 예외가 throw되고 login 라우트로 리디렉트됩니다.
Source: docs/socialite.md