플러터:인증(OAuth2): 두 판 사이의 차이
보이기
새 문서: {{플러터}} = 커스텀 OAuth2 인증 (네이버, 카카오 등) = Firebase는 Google/Apple/GitHub 등 주요 소셜 로그인만 공식 지원합니다. 네이버, 카카오, 디스코드 등의 OAuth2 인증은 '''직접 구현'''해야 합니다. == 방식 비교 == {| class="wikitable" !방식 !장점 !단점 !사용 케이스 |- |Firebase Auth 공식 |설정만으로 완성, 자동 토큰 관리 |지원 제공업체만 가능 |Google, Apple, GitHub, Microsoft |- |Fireba... |
|||
| (같은 사용자의 중간 판 하나는 보이지 않습니다) | |||
| 1번째 줄: | 1번째 줄: | ||
{{플러터}} | {{플러터}} | ||
= | = [아직 미완의 문서입니다.] = | ||
= | = 개요 = | ||
* Firebase는 Google/Apple/GitHub 등 주요 소셜 로그인만 공식 지원함. | |||
* 이 문서에선 일반적인 표준 OAuth2 규격을 100% 준수(Authorization Code + PKCE)하는 경우의 로그인을 구현함.(flutter_appauth 사용) | |||
* Django(OAuth2 Provider)·Auth0·Keycloak 등 OAuth2 표준을 준수하는 서버라면 모두 동일한 방식으로 연동 가능함. | |||
=== 비고 === | |||
* 네이버, 카카오, 디스코드 등의 인증은 OAuth2와 유사하지만 표준을 완전히 따르지 않기 때문에 직접 구현해야 하는데, 네이버, 카카오는 일반 OAuth2의 규격과 조금 다름. 아래 패키지를 이용하면 앱투앱 로그인도 간편하게 이루어짐. | |||
* 카카오: <code>kakao_flutter_sdk</code> (공식) | |||
* 네이버: <code>flutter_naver_login</code> | |||
* 디스코드: <code>discord_oauth2</code> | |||
= 사전 준비 = | |||
== | == 필수 개념 == | ||
* Authorization Code Flow with PKCE | |||
* Authorization Endpoint: <code>/authorize</code> | |||
* Token Endpoint: <code>/token</code> | |||
* Client ID / Redirect URI | |||
{| class="wikitable" | {| class="wikitable" | ||
! | |+ | ||
!할 일 | |||
!설명 | !설명 | ||
!비고 | |||
|- | |- | ||
| | |<code>pubspec.yaml</code>에 패키지 추가 | ||
| | | | ||
|<syntaxhighlight lang="yaml"> | |<syntaxhighlight lang="yaml"> | ||
dependencies: | dependencies: | ||
flutter_appauth: ^5.0.0 | |||
</syntaxhighlight> | </syntaxhighlight> | ||
|- | |||
|Redirect URI 등록 | |||
|[스킴 지정하는 법에 대해선 따로 찾아보아야 할듯.] | |||
|Flutter 앱은 보통 스킴 기반 URI를 사용함. | |||
|- | |||
| | |||
| | |||
|} | |} | ||
= | = Flutter 코드 (최소 구현 예제) = | ||
== | == 인증 요청 == | ||
<syntaxhighlight lang="dart"> | <syntaxhighlight lang="dart"> | ||
import 'package: | import 'package:flutter_appauth/flutter_appauth.dart'; | ||
final appAuth = FlutterAppAuth(); | |||
Future<void> login() async { | |||
final result = await appAuth.authorizeAndExchangeCode( | |||
AuthorizationTokenRequest( | |||
"your_client_id", | |||
"com.example.app:/oauth", | |||
serviceConfiguration: AuthorizationServiceConfiguration( | |||
authorizationEndpoint: "https://your-server.com/o/authorize/", | |||
tokenEndpoint: "https://your-server.com/o/token/", | |||
), | ), | ||
) | scopes: ['openid', 'profile', 'email'], | ||
), | |||
); | |||
print("Access Token: ${result?.accessToken}"); | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== | == 토큰 갱신 == | ||
<syntaxhighlight lang="dart"> | <syntaxhighlight lang="dart"> | ||
final refreshed = await appAuth.token( | |||
final | TokenRequest( | ||
"your_client_id", | |||
/ | "com.example.app:/oauth", | ||
refreshToken: result.refreshToken, | |||
serviceConfiguration: AuthorizationServiceConfiguration( | |||
authorizationEndpoint: "https://your-server.com/o/authorize/", | |||
tokenEndpoint: "https://your-server.com/o/token/", | |||
), | |||
), | |||
); | ); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== | = OAuth 제공자 설정 = | ||
== | == Django OAuth2 서버 연동 == | ||
=== | === Django-OAuth-Toolkit 설정 === | ||
<syntaxhighlight lang="python"> | |||
OAUTH2_PROVIDER = { | |||
"ACCESS_TOKEN_EXPIRE_SECONDS": 3600, | |||
"PKCE_REQUIRED": True, | |||
} | |||
</syntaxhighlight> | |||
= | |||
== | === Application 등록 === | ||
* Client type: Public | |||
* Authorization grant type: Authorization code | |||
* Redirect URIs: <code>com.example.app:/oauth</code> | |||
---- | |||
=== 최소 동작 구조 요약 === | |||
# OAuth2 서버에서 Client 등록 (Redirect URI 포함) | |||
# Flutter에서 <code>flutter_appauth</code>를 이용해 로그인 | |||
# OAuth 서버가 Authorization Code 발급 | |||
# Flutter가 Authorization Code → Access Token 교환 | |||
# 필요 시 Refresh Token으로 갱신 | |||
2025년 12월 10일 (수) 04:21 기준 최신판
- 플러터:개요
- 플러터:실행
- 플러터:개념 잡기
- 권한 사용
- 위젯
- 플러터:DB연결
- 플러터:Firebase(미완)
- 플러터:MySQL(미완)
- 디자인
- 플러터:배포
- 플러터:배포(안드로이드)(미완)
- 플러터:배포(iOS)(미완)
- 플러터:참고자료
- 플러터:위젯
- 플러터:구글 AdMob(미완)
- 플러터:라이브러리
- Firebase는 Google/Apple/GitHub 등 주요 소셜 로그인만 공식 지원함.
- 이 문서에선 일반적인 표준 OAuth2 규격을 100% 준수(Authorization Code + PKCE)하는 경우의 로그인을 구현함.(flutter_appauth 사용)
- Django(OAuth2 Provider)·Auth0·Keycloak 등 OAuth2 표준을 준수하는 서버라면 모두 동일한 방식으로 연동 가능함.
- 네이버, 카카오, 디스코드 등의 인증은 OAuth2와 유사하지만 표준을 완전히 따르지 않기 때문에 직접 구현해야 하는데, 네이버, 카카오는 일반 OAuth2의 규격과 조금 다름. 아래 패키지를 이용하면 앱투앱 로그인도 간편하게 이루어짐.
- 카카오:
kakao_flutter_sdk(공식) - 네이버:
flutter_naver_login - 디스코드:
discord_oauth2
- Authorization Code Flow with PKCE
- Authorization Endpoint:
/authorize - Token Endpoint:
/token - Client ID / Redirect URI
| 할 일 | 설명 | 비고 |
|---|---|---|
pubspec.yaml에 패키지 추가
|
dependencies:
flutter_appauth: ^5.0.0
| |
| Redirect URI 등록 | [스킴 지정하는 법에 대해선 따로 찾아보아야 할듯.] | Flutter 앱은 보통 스킴 기반 URI를 사용함. |
import 'package:flutter_appauth/flutter_appauth.dart';
final appAuth = FlutterAppAuth();
Future<void> login() async {
final result = await appAuth.authorizeAndExchangeCode(
AuthorizationTokenRequest(
"your_client_id",
"com.example.app:/oauth",
serviceConfiguration: AuthorizationServiceConfiguration(
authorizationEndpoint: "https://your-server.com/o/authorize/",
tokenEndpoint: "https://your-server.com/o/token/",
),
scopes: ['openid', 'profile', 'email'],
),
);
print("Access Token: ${result?.accessToken}");
}
final refreshed = await appAuth.token(
TokenRequest(
"your_client_id",
"com.example.app:/oauth",
refreshToken: result.refreshToken,
serviceConfiguration: AuthorizationServiceConfiguration(
authorizationEndpoint: "https://your-server.com/o/authorize/",
tokenEndpoint: "https://your-server.com/o/token/",
),
),
);
OAUTH2_PROVIDER = {
"ACCESS_TOKEN_EXPIRE_SECONDS": 3600,
"PKCE_REQUIRED": True,
}
- Client type: Public
- Authorization grant type: Authorization code
- Redirect URIs:
com.example.app:/oauth
- OAuth2 서버에서 Client 등록 (Redirect URI 포함)
- Flutter에서
flutter_appauth를 이용해 로그인 - OAuth 서버가 Authorization Code 발급
- Flutter가 Authorization Code → Access Token 교환
- 필요 시 Refresh Token으로 갱신