๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Flutter

[ Flutter / ์• ํ”Œ ๋กœ๊ทธ์ธ ] Firebase๋ฅผ ์ด์šฉํ•œ SignIn With Apple ๊ตฌํ˜„

 

 

 

 

Flutter ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ๊ฐœ๋ฐœ์ค‘์ธ๋ฐ,

๋“ฃ๊ธฐ๋ก  ( WEB / Android / ios 13๋ฒ„์ „ ์ดํ•˜ ์ง€์›์˜ ๊ฒฝ์šฐ )Apple ๋กœ๊ทธ์ธ์ด ๋‚œ์ด๋„ ํ—ฌ์ด๋ผ๋Š” ์ด์•ผ๊ธฐ๋ฅผ ๋“ค์—ˆ๋‹ค..๐Ÿ˜ฑ

ํ•˜์ง€๋งŒ ๋‚˜๋Š” ios 13 ์ด์ƒ ์ง€์›์— ios Apple ๋กœ๊ทธ์ธ๋งŒ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ต‰์žฅํžˆ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค!๐Ÿ˜

 

 

์ด์ œ ์ฐจ๊ทผ ์ฐจ๊ทผ ์• ํ”Œ ๋กœ๊ทธ์ธ์— ๋Œ€ํ•ด ๋ฟŒ์…”๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค..!

๐Ÿ”ฅ ์ค€๋น„ํ•˜๊ธฐ


๐Ÿ˜™ ios 13.0 ์ด์ƒ์˜ ์• ํ”Œ ๋กœ๊ทธ์ธ๋งŒ ์ง€์›ํ•  ๊ฒฝ์šฐ 
- Firebase์— ios ํ”„๋กœ์ ํŠธ๊ฐ€ ์ƒ์„ฑ๋ผ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
- ์• ํ”Œ ๊ฐœ๋ฐœ์ž ํ”„๋กœ๊ทธ๋žจ์— ์œ ๋ฃŒ ํšŒ์›์œผ๋กœ ๊ฐ€์ž…๋ผ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๐Ÿ˜จ ios 13.0 ์ดํ•˜ ๋ฒ„์ „ ๋ฐ web, Android ์• ํ”Œ ๋กœ๊ทธ์ธ์„ ์ง€์› ํ•  ๊ฒฝ์šฐ  
- Firebase์— ios ํ”„๋กœ์ ํŠธ๊ฐ€ ์ƒ์„ฑ๋ผ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
- ์• ํ”Œ ๊ฐœ๋ฐœ์ž ํ”„๋กœ๊ทธ๋žจ์— ์œ ๋ฃŒ ํšŒ์›์œผ๋กœ ๊ฐ€์ž…๋ผ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
- App Service ID ๋ฐ Key ํ•„์š”.
- ์• ํ”Œ ์„œ๋ฒ„์˜ ์ฝœ๋ฐฑ์„ ๋ฐ›์„ ์™ธ๋ถ€ ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ, ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด Glitch๋ฅผ ์ด์šฉํ•˜์—ฌ ์„œ๋ฒ„๋ฆฌ์Šค๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅ.

 

 

์ „์ฒด Flow ๋Š” ์•„๋ž˜์˜ ๋งํฌ๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

๐Ÿ‘‰ Pub Dev์˜ sign_in_with_apple ์ฐธ๊ณ 

๐Ÿ‘‰ FlutterFire Social Auth - Apple ์ฐธ๊ณ 

 

 

 

 

 


 

 

๐Ÿงš๐Ÿป‍โ™‚๏ธ  ํ”Œ๋Ÿฌํ„ฐ ์• ํ”Œ ๋กœ๊ทธ์ธ ๊ธฐ๋ณธ ์„ธํŒ… ์‹œ๊ฐ„  ๐Ÿงš๐Ÿป‍โ™‚๏ธ

 

 

 

 

* ์•„๋ž˜์˜ ๋‚ด์šฉ์— ํ•ด๋‹น๋˜๋Š” ์ „์ฒด ์„ธํŒ… ๋ฐฉ๋ฒ•์€ ๐Ÿ‘‰Setup-Register an App ID ์ฐธ๊ณ 

 

sign_in_with_apple | Flutter Package

Flutter bridge to initiate Sign in with Apple (on iOS, macOS, and Android). Includes support for keychain entries as well as signing in with an Apple ID.

pub.dev

 

 

 

 

 

 

1. Apple Developer )  App ID๋ฅผ ๋“ฑ๋กํ•œ๋‹ค. (์• ํ”Œ ๋กœ๊ทธ์ธ์„ ์ด์šฉํ•  App ID ๋“ฑ๋ก)

 

Apple๊ฐœ๋ฐœ์ž ํŽ˜์ด์ง€ -> Certificates, Identifiers & Profiles / Identifiers ํด๋ฆญํ•˜์—ฌ ์ƒˆ๋กœ์šด App ID ๋“ฑ๋ก.

- "Register an App ID"์„ ํด๋ฆญ

- "App IDs"๋ฅผ ์„ ํƒํ•˜๊ณ  "Continue" ํด๋ฆญ.

- "Description"๊ณผ "Bundle ID"๋ฅผ ์„ค์ •ํ•˜๊ณ , "Sign In with Apple" ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ์„ ํƒ.

-  ์ผ๋ฐ˜์ ์œผ๋กœ ์—ฌ๊ธฐ์„œ๋Š” "Enable as a primary App ID"์˜ ๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ ์ถฉ๋ถ„.

- "Continue"ํด๋ฆญ ํ›„  "Register"์„ ํด๋ฆญํ•˜์—ฌ App ID ์ƒ์„ฑ ์™„๋ฃŒ.

 

 

 

 

 

 

 

 

 

2. Apple Developer ) ์›น or Android ํ†ตํ•ฉ์„ ์œ„ํ•œService ID ์ƒ์„ฑ.

๋‚˜๋Š” <IOS 13.0 ์ดํ•˜ >์—์„œ๋งŒ ์• ํ”Œ ๋กœ๊ทธ์ธ์„ ์ง€์›ํ• ๊ฑฐ๋ผ์„œ ์›๋ž˜ ํŒจ์Šค์ง€๋งŒ, ๊ธ€ ๋Œ€์ถฉ ์ฝ๊ณ  ๋”ฐ๋ผํ•ด๋ฒ„๋ฆผ.ใ…Ž.

 

์• ํ”Œ ์„œ๋ฒ„์™€ ํ†ต์‹ ์„ ์œ„ํ•œ Key ์ƒ์„ฑ ํ™”๋ฉด - Apple Developer

Sign in with Apple ์ฒดํฌ ํ›„ ์˜ค๋ฅธ์ชฝ Configure ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ, ์œ„์˜ ๊ณผ์ •์—์„œ ์ƒ์„ฑ๋œ ์•ฑ id๋ฅผ ์„ ํƒํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Continue ๋ฅผ ํด๋ฆญํ•˜๋ฉด ํ‚ค๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ƒ๋‹จ์— ํ‚ค ๋‹ค์šด๋กœ๋“œ์— ๋Œ€ํ•œ ์•ˆ๋‚ด๋ฌธ์ด ๋‚˜์˜ค๋Š”๋ฐ,

ํ‚ค๋ฅผ ๋‹ค์šด๋กœ๋“œํ•œ ํ›„์—๋Š” ์„œ๋ฒ„ ๋ณต์‚ฌ๋ณธ์ด ์ œ๊ฑฐ๋˜๋ฏ€๋กœ ํ‚ค๋ฅผ ๋‹ค์‹œ ๋‹ค์šด๋กœ๋“œ ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ํ•œ๋‹ค.

๋‹น์žฅ ํ‚ค๋ฅผ ๋‹ค์šด๋ฐ›์„ ์ค€๋น„๊ฐ€ ์•ˆ๋ผ์žˆ๋‹ค๋ฉด Done์„ ํด๋ฆญ ํ›„ ๋‚˜์ค‘์— ๋‹ค์šด๋กœ๋“œ ํ•˜๋ผ๋Š” ์•ˆ๋‚ด๊ฐ€ ๋‚˜์˜จ๋‹ค.

๋‚˜๋Š” ๋ฐ”๋กœ ๋‹ค์šด๋กœ๋“œ ํ–ˆ์ง€๋งŒ, ์ง€๊ธˆ์€ ios13 ์ด์ƒ๋งŒ ์• ํ”Œ ๋กœ๊ทธ์ธ์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์“ธ ์ผ ์—†์Œ.. ๋‚˜์ค‘์—” ์“ฐ๊ฒ ์ง€..

 

 

 

 

 

 

 

 

 

3. Apple Developer ) ์•ฑ์— Apple๋กœ ๋กœ๊ทธ์ธ์„ ์‚ฌ์šฉ ์„ค์ •ํ•˜๊ธฐ.

      ( Apple ๊ฐœ๋ฐœ์ž ์‚ฌ์ดํŠธ์˜ Certificates, Identifiers & Profiles ํŽ˜์ด์ง€์—์„œ ์„ค์ •.)

 

 

 

 

 

 

 

 

 

 

4. Firebase ) Firebase Authentication์—์„œ Apple ๋กœ๊ทธ์ธ ํ™œ์„ฑํ™”.

 

Firebase / Myproject(๋‚ด ํ”„๋กœ์ ํŠธ ๋ช…) / Authentication / Sign-in method

 

 

 

 

 

 

 

 

3. Xcode ) Xcode์—์„œ Apple Login ๊ธฐ๋Šฅ ํ™œ์„ฑํ™”

 

Xcode์—์„œ Capability๋ฅผ ๋”๋ธ” ํด๋ฆญ ํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๋‚˜์˜ค๋Š”๋ฐ,

์—ฌ๊ธฐ์— ์•„๋ž˜์˜ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ Sign in with Apple ์„œ์น˜ํ•ด์„œ ๋”๋ธ” ํด๋ฆญํ•˜๋ฉด ์ ์šฉ๋œ๋‹ค.

 

๋”ฐ๋ž€ ! ๊ธฐ๋ณธ ์…‹ํŒ… ์™„๋ฃŒ โœจ

 

 

 

 

 

 

 

 

 

 

๐Ÿ‘‰ ์• ํ”Œ ๊ฐœ๋ฐœ์ž ๊ณ„์ •์œผ๋กœ ํ•ด์•ผํ•  ๊ฒƒ๋“ค ์ •๋ฆฌ.

 

 

๐Ÿ‘‰ firebase์—์„œ ํ•ด์•ผํ•  ๊ฒƒ๋“ค ์ •๋ฆฌ.

 

 


 

 

 

 

 

์œ„์˜ ๊ธฐ๋ณธ ์„ธํŒ…์„ ๋๋‚ด๊ณ  Flutter๋กœ ๋„˜์–ด์™€์„œ pub dev์˜ sign_in_with_apple ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ ๋ณด๋ฉด

์• ํ”Œ ๋กœ๊ทธ์ธ์— ๋Œ€ํ•œ ํ†ตํ•ฉ ์„ค๋ช…์ด ๋‚˜์˜ค๋Š”๋ฐ

 

์ž๊ฒฉ ์ฆ๋ช…์„ ๋ฐ›์€ ํ›„์—๋Š” ์• ํ”Œ ์„œ๋ฒ„์˜ (์ธ์ฆ ์ •๋ณด ์œ ํšจ์„ฑ ์ฒดํฌ ๋ฐ ์–ธ๊ธ‰๋œ ์œ ์ €์™€ ์‹ค์ œ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€) ํ™•์ธ ํ›„
๋‹น์‹ ์˜(๊ฐœ๋ฐœ์ž) ์‹œ์Šคํ…œ์—์„œ ์ƒˆ๋กœ์šด ์„ธ์…˜์„ ํŒŒ์ƒํ•ด์•ผ ํ•œ๋‹ค.
๋‹น์‹ ์˜(๊ฐœ๋ฐœ์ž) ์„œ๋ฒ„๋Š” ๋งค์ผ ์• ํ”Œ๊ณผ์˜ ์„ธ์…˜์„ ํ™•์ธํ•ด์•ผํ•˜๊ณ (์ดˆ๊ธฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์—์„œ ์–ป์€ refresh token์„ ํ†ตํ•ด)
์• ํ”Œ์—์„œ authorization์„ ์ค‘๋‹จ ์‹œํ‚จ๋‹ค๋ฉด, ๋‹น์‹ ์˜ ์‹œ์Šคํ…œ์—์„œ ์„ธ์…˜์„ ํŽ˜์ง€ํ•ด์•ผ ํ•œ๋‹ค.

 

๋ผ๊ณ  ๋‚˜์™€์žˆ๋Š” ๋“ฏ... ( ์˜ค์—ญ ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ..๐Ÿ˜‚)

 

 

...ใ…Žใ„ทใ„ท ์ด๊ฑธ ๋ณด๊ณ  ๋‚˜๋Š” ์„œ๋ฒ„ ํ†ต์‹ ์„ ์œ„ํ•œ ํ‚ค๋ฅผ ์ƒ์„ฑ์„ ํ–ˆ์ง€๋งŒ, ๋‚ด ์ƒํ™ฉ์—์„œ๋Š” ํ‚ค ์ƒ์„ฑ์€ ํ•„์š”์—†๋‹ค. ( ๋‹ค์‹œ ์–˜๊ธฐํ•˜์ง€๋งŒ,

๋‚˜๋Š” ios 13์ด์ƒ ๋ฒ„์ „๋งŒ ios์—์„œ ์ง€์›ํ•  ์˜ˆ์ •์ด๋ผ-! )

 

๊ทธ ์ด์œ ๋Š” pub dev์˜ sign_in_with_apple ํ”Œ๋Ÿฌ๊ทธ์ธ ์—๋Š”

์ด๋ฏธ Glitch๋ฅผ ์ด์šฉํ•ด์„œ ์„œ๋ฒ„๋ฆฌ์Šค๋กœ ์• ํ”Œ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•ด๋†จ๊ธฐ ๋•Œ๋ฌธ์ด๋‹น-!

๊บ„ํ•ณ๐Ÿคฉ

 

 

 

 1. pub.dev ์˜ sign_in_with_apple ํŒจํ‚ค์ง€ ์„ค์น˜

 

 

 flutter pub add sign_in_with_apple
 flutter pub get

Installing์„ ์ฐธ๊ณ ํ•˜์—ฌ

ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์—์„œ flutter pub add sign_in_with_apple ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ dependency ์ถ”๊ฐ€ ํ›„

flutter pub get ํ•ด์ฃผ๊ณ 

 

 

import 'package:sign_in_with_apple/sign_in_with_apple.dart';

์• ํ”Œ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ํŒŒ์ผ์— ์œ„์™€ ๊ฐ™์ด import ํ•ด์ฃผ๋ฉด ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ ์ค€๋น„ ๋. 

 

 

 

๊ทธ๋ฆฌ๊ณ  ์• ํ”Œ ๋กœ๊ทธ์ธ์„ ๋ˆŒ๋ €์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋Š”

import 'dart:convert';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:sign_in_with_apple/sign_in_with_apple.dart';

Future<UserCredential> signInWithApple() async {
  final appleCredential = await SignInWithApple.getAppleIDCredential(
    scopes: [
      AppleIDAuthorizationScopes.email,
      AppleIDAuthorizationScopes.fullName,
    ],
  );

  // Create an `OAuthCredential` from the credential returned by Apple.
  final oauthCredential = OAuthProvider("apple.com").credential(
    idToken: appleCredential.identityToken,
    accessToken: appleCredential.authorizationCode,
  );

  // Sign in the user with Firebase. If the nonce we generated earlier does
  // not match the nonce in `appleCredential.identityToken`, sign in will fail.
  return await FirebaseAuth.instance.signInWithCredential(oauthCredential);
}

์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๊ณ  simulator (ios 13 ๋ฒ„์ „ ์ด์ƒ) ์—์„œ ๋Œ๋ ค๋ณด๋‹ˆ ์ž˜ ๋œ๋‹น ๐ŸŽ‰ ์ง์ง์ง ๐ŸŽ‰

 

 

 

 

 

 

 

 

 

 

 

 

 

* Flutter ํŒŒ์ด์–ด๋ฒ ์ด์Šค ์• ํ”Œ ๋กœ๊ทธ์ธ ( ios 13 ๋ฒ„์ „ ์ด์ƒ ) ๋ฐฉ๋ฒ•์ด ์–ด๋ ต๋‹ค๋ฉด,

์ด ์œ ํŠœ๋ธŒ ๋ฅผ ์ฐธ๊ณ  ํ•ด์„œ ๋”ฐ๋ผํ•˜๋ฉด ์‰ฝ๊ฒŒ ๋”ฐ๋ผํ•  ์ˆ˜ ์žˆ๋‹ค.

( Flutter ๊ฐœ๋ฐœ์ž์ธ ์ง€์ธ๋ถ„๊ป˜์„œ ํ•ด๋‹น ์œ ํŠœ๋ธŒ ์•Œ๋ ค์ฃผ์‹ฌใ…Ž.ใ…Ž )