플러터:인증(OAuth2): 두 판 사이의 차이
보이기
내용을 "{{플러터}} = 개요 = * Firebase는 Google/Apple/GitHub 등 주요 소셜 로그인만 공식 지원함. * 이 문서에선 일반적인 표준 OAuth2 규격을 100% 준수하는 경우의 로그인을 구현함.(flutter_appauth 사용) === 비고 === * 네이버, 카카오, 디스코드 등의 OAuth2 인증은 직접 구현해야 하는데, 네이버, 카카오는 일반 OAuth2의 규격과 조금 다름. 아래 패키지를 이용하면 앱투앱 로그..."(으)로 바꿈 |
|||
| 1번째 줄: | 1번째 줄: | ||
{{플러터}} | {{플러터}} | ||
= [아직 미완의 문서입니다.] = | |||
= 개요 = | = 개요 = | ||
* Firebase는 Google/Apple/GitHub 등 주요 소셜 로그인만 공식 지원함. | * Firebase는 Google/Apple/GitHub 등 주요 소셜 로그인만 공식 지원함. | ||
* 이 문서에선 일반적인 표준 OAuth2 규격을 100% | * 이 문서에선 일반적인 표준 OAuth2 규격을 100% 준수(Authorization Code + PKCE)하는 경우의 로그인을 구현함.(flutter_appauth 사용) | ||
* Django(OAuth2 Provider)·Auth0·Keycloak 등 OAuth2 표준을 준수하는 서버라면 모두 동일한 방식으로 연동 가능함. | |||
=== 비고 === | === 비고 === | ||
* 네이버, 카카오, 디스코드 등의 | * 네이버, 카카오, 디스코드 등의 인증은 OAuth2와 유사하지만 표준을 완전히 따르지 않기 때문에 직접 구현해야 하는데, 네이버, 카카오는 일반 OAuth2의 규격과 조금 다름. 아래 패키지를 이용하면 앱투앱 로그인도 간편하게 이루어짐. | ||
* 카카오: <code>kakao_flutter_sdk</code> (공식) | * 카카오: <code>kakao_flutter_sdk</code> (공식) | ||
* 네이버: <code>flutter_naver_login</code> | * 네이버: <code>flutter_naver_login</code> | ||
* 디스코드: <code>discord_oauth2</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" | |||
|+ | |||
!할 일 | |||
!설명 | |||
!비고 | |||
|- | |||
|<code>pubspec.yaml</code>에 패키지 추가 | |||
| | |||
|<syntaxhighlight lang="yaml"> | |||
dependencies: | |||
flutter_appauth: ^5.0.0 | |||
</syntaxhighlight> | |||
|- | |||
|Redirect URI 등록 | |||
|[스킴 지정하는 법에 대해선 따로 찾아보아야 할듯.] | |||
|Flutter 앱은 보통 스킴 기반 URI를 사용함. | |||
|- | |||
| | |||
| | |||
|} | |||
= Flutter 코드 (최소 구현 예제) = | |||
== 인증 요청 == | |||
<syntaxhighlight lang="dart"> | |||
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 lang="dart"> | |||
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/", | |||
), | |||
), | |||
); | |||
</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으로 갱신