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

Flutter

[ Flutter / ํŠธ์œ„ํ„ฐ ๋กœ๊ทธ์ธ ] Firebase๋ฅผ ์ด์šฉํ•œ Twitter ๋กœ๊ทธ์ธ ๊ตฌํ˜„

 

 

ํšŒ์‚ฌ์—์„œ ํ”Œ๋Ÿฌํ„ฐ ์•ฑ์„ ๋งŒ๋“ค๋ฉด์„œ ์ง€๊ธˆ์€ ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š” ์ค‘ ๐Ÿ”ฅ

๊ตฌ๊ธ€, ์นด์นด์˜คํ†ก, ์• ํ”Œ๊นŒ์ง€ ๊ตฌํ˜„ํ•ด๋†จ๊ณ 

๋งˆ์ง€๋ง‰ ๋‚จ์€ ํŠธ์œ„ํ„ฐ! (์šฐ๋ฆฌ ์•ฑ์˜ ํŠน์„ฑ์ƒ ํŠธ์œ„ํ„ฐ ์‚ฌ์šฉ์ž๋“ค์ด ์ฃผ ํƒ€๊ฒŸ์ธต์ด๋ผ๊ณ  ์˜ˆ์ƒ์ค‘)

 

ํŠธ์œ„ํ„ฐ๋Š” ๋‹คํ–‰ํžˆ๋„ firebase ์—์„œ ๋กœ๊ทธ์ธ์„ ์ œ๊ณตํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ๊ต‰์žฅํžˆ ์‰ฝ๊ฒŒ ๋กœ๊ทธ์ธ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ์˜ˆ์ƒํ–ˆ์ง€๋งŒ( ์‘~์•„๋‹ˆ์•ผ๐Ÿ˜Š),

์–ด์ œ ์•„๋ž˜์™€ ๊ฐ™์€ ์˜ค๋ฅ˜ ๋ฉ”์„ธ์ง€์™€ ํ•จ๊ป˜ ํŠธ์œ„ํ„ฐ ๋กœ๊ทธ์ธ ๊ตฌํ˜„์— ์‹คํŒจํ–ˆ๋‹ค.ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹

 

 

^^....

 

์ด์œ ๊ฐ€ ๋ญ˜๊นŒ.. ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ด๋„ ๋น„์Šทํ•œ ๋ฌธ์ œ๋ฅผ ๊ฒช๋Š” ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์˜ ์งˆ๋ฌธ๋“ค ๋ฟ..

์ด ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ์ฑ…์„ ์ œ์‹œํ•ด์ฃผ๋Š” ๊ธ€์„ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ๋‹ค ....!!!

 

 

 

๐Ÿฅณํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ๋ฌธ์ œ ํ•ด๊ฒฐ.๐Ÿ˜™

 

 

 

FlutterFire์˜ Authentication - Twitter ์˜ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ผ

์ฐจ๊ทผ ์ฐจ๊ทผ ๊ตฌํ˜„ํ•ด๋ณด์ž...! 

 

๊ฐ€์žฅ ๋จผ์ € ํ•  ์ผ์€ ํŠธ์œ„ํ„ฐ ๊ฐœ๋ฐœ์ž ๊ณ„์ •์„ ๋งŒ๋“ค๊ณ , ํŠธ์œ„ํ„ฐ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•  ์•ฑ API๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

 

* ํŠธ์œ„ํ„ฐ API๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ 1์ผ ์ •๋„ ์†Œ์š”(ํŠธ์œ„ํ„ฐ ํŒ€์—์„œ ๊ฒ€ํ† ํ•˜๋Š” ์‹œ๊ฐ„์ด)๋  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์—ฌ์œ ๋กญ๊ฒŒ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋†“๋Š” ๊ฒŒ ์ข‹๋‹ค.

(Twitter API๋ฅผ ์“ฐ๋Š” ๋ชฉ์  ๋ฐ ์‚ฌ์šฉ์ž ์ •๋ณด ์‚ฌ์šฉ ๋ฒ”์œ„, ์–ด๋–ค ๊ธฐ๋Šฅ๋“ค์„ ๊ฐ€์ ธ๋‹ค ์“ธ ๊ฑด์ง€ ๋“ฑ๋“ฑ +

์•ฑ ์„œ๋น„์Šค ์†Œ๊ฐœ ๋“ฑ์„ ์ œ์ถœํ•˜๋ฉด Twitter ํŒ€์—์„œ ๊ฒ€ํ†  ํ›„ api ์ด์šฉ ์Šน์ธ์„ ํ•ด์ค€๋‹ค-! ์ด ๋ชจ๋“  ๊ฒƒ์€ ์˜์–ด๋กœ..^^...๐Ÿ˜‚)

 

 

API Key ์™€ Secret Key๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” Developer Portal์—์„œ ์ƒ์„ฑ๋œ App์ด ์žˆ์–ด์•ผ API ์‚ฌ์šฉ ์‹ ์ฒญ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค-!

 

 

 

 


 

 

๐Ÿงš๐Ÿป ํŠธ์œ„ํ„ฐ ๊ฐœ๋ฐœ์ž ์•ฑ ์ƒ์„ฑ ๊ณผ์ • ๐Ÿงš๐Ÿป

 

 

 

 

 

1. Developer Portal ์— ์ ‘์† ํ›„ ๋‚ด ์ƒํ™ฉ์— ๋งž๋Š” ํŠธ์œ„ํ„ฐ ๊ฐœ๋ฐœ์ž ํ”Œ๋žซํผ์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์ด์œ  ์„ ํƒ ! 

 

 

๐Ÿ‘‡

 

 

2. ๊ธฐ๋ณธ ์ •๋ณด ์ž…๋ ฅ

 

๐Ÿ‘‡

 

 

3. ์‚ฌ์šฉ ์˜๋„ ์ž…๋ ฅ.

    ํŠธ์œ„ํ„ฐ ๋ฐ์ดํ„ฐ / API๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ์˜์–ด๋กœ ์„ค๋ช…ํ•˜๊ธฐ๐Ÿ˜จ

    ๋””ํ…Œ์ผํ•œ ์„ค๋ช…์ด ๋งŽ์„์ˆ˜๋ก ๊ฒ€ํ† ์™€ ์Šน์ธ์ด ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค. <- ๋ผ๊ณ  ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ ์‹ฌ์ง€์–ด ์ตœ์†Œ 200์ž ์ด์ƒ ใ… ใ… ใ… ใ… 

    ๋ˆˆ๋ฌผ์„ ํ˜๋ฆฌ๋ฉฐ ํŒŒํŒŒ๊ณ ๋ฅผ ์ผญ๋‹ˆ๋‹ค..

 

 

๐Ÿ‘‡

 

 

4. ์—ฌ์ฐจ ์ €์ฐจ ๋„˜๊ธฐ๋ฉด ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ๋‚ด์šฉ๋“ค ๋‹ค์‹œ ํ™•์ธํ•˜๊ณ  ํ‹€๋ฆฐ ๋ถ€๋ถ„์€ ์ˆ˜์ •ํ•˜๊ณ  ๋„˜๊ธฐ๊ธฐ.

 

 

๊ทธ ์ดํ›„ ์•ฝ๊ด€ ์ญ‰ ์ฝ์–ด๋ณด๊ณ  ๋™์˜ํ•˜๊ณ  ์ œ์ถœํ•˜๋ฉด-!

 

๐Ÿ‘‡

 

 

์ง . ๋ฉ”์ผ๋กœ ๊ฐ€์„œ ํŠธ์œ„ํ„ฐ์—์„œ ์˜จ ๋ฉ”์ผ์„ ํ™•์ธํ•˜๋ฉด, confirm your email ์ด ์™€์žˆ๋‹ค.

์ด๋ฉ”์ผ ์ธ์ฆ๊ณผ์ •์„ ๊ฑฐ์นœ ๋’ค ๋‹ค์‹œ ํŠธ์œ„ํ„ฐ ํŒ€์˜ ์Šน๋‚™ ์ด๋ฉ”์ผ์„ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ๋! 

 

 

 

 


 

 

 

์ด์ œ API Key์™€ Secret Key๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์•˜๋‹ค๋Š” ์ „์žฌ ํ•˜์— ์‹œ์ž‘ํ•ด๋ณด์ž ๐Ÿ”ฅ

 

 

 

 

 

๊ฐ€์žฅ ๋จผ์ € ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•ด ๋ณด์ž.

> pub.dev ์— ์žˆ๋Š” twitter_login ๋งํฌ

 

 

 

 

Flutter์˜ ํ”„๋กœ์ ํŠธ๋กœ ์™€์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•ด ์ฃผ๊ณ ~๐Ÿ˜™

flutter pub add twitter_login
flutter pub get

 

 

 

Twitter ๋กœ๊ทธ์ธ ์ด๋ฒคํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ํŽ˜์ด์ง€์— import - โ˜…

import 'package:twitter_login/twitter_login.dart';

 

 

 

ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜ ์™„๋ฃŒ ! 

 

 

๊ทธ๋Ÿผ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ํŠธ์œ„ํ„ฐ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•ด ๋ณด์ž,

์šฐ์„  ํŠธ์œ„ํ„ฐ ์„ค์ •์— ๋“ค์–ด๊ฐˆ Callback URL์ด ํ•„์š”ํ•œ๋ฐ,

์•„๋ž˜์™€ ๊ฐ™์€  Firebase ๊ธฐ๋ณธ callback URL์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ๋‚˜์˜จ๋‹ค..๋‘๋‘ฅ..! ๐Ÿ˜ฑ

https://abcdefg.firebaseapp.com/__/auth/handler

 

์ฒ˜์Œ์— ๋ฌธ์„œ๋ฅผ ๋Œ€์ถฉ ์ฝ๊ณ  firebase์˜ callback URL์„ ๋„ฃ์—ˆ๋”๋‹ˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.^^.... 

..๊ผญ ๋ฌธ์„œ๋Š” ๊ผผ๊ผผํ•˜๊ฒŒ ๋๊นŒ์ง€ ์ฝ๊ณ  ์‹œ์ž‘ํ•˜๊ธธ...!!๐Ÿ˜‚

 

 

 

์˜ค๋ฅ˜ ๋ฐœ์ƒ.. ^^

Unable to process request due to missing initial state. This may happen if browser sessionStorage is inaccessible or accidentally cleared.

 

ํ•ด๋‹น ์˜ค๋ฅ˜๋กœ ์—ด์‹ฌํžˆ ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ดค์ง€๋งŒ, ์ฒ˜์Œ์— ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ

๋ชจ๋‘ ๋ฌธ์ œ๋งŒ ์ œ์‹œํ•  ๋ฟ... ํ•ด๊ฒฐ์‚ฌ๊ฐ€ ์—†์—ˆ๋‹ค...^_ใ… 

 

์ฃผ๋ณ€ Flutter ๊ฐœ๋ฐœ์ž ์ง€์ธ๋ถ„๊ป˜ ์กฐ์‹ฌํžˆ ์—ฌ์ญค๋ดค๋”๋‹ˆ ํŠธ์œ„ํ„ฐ ๋กœ๊ทธ์ธ์€ ๊ตฌํ˜„ํ•œ์ ์ด ์—†์–ด์„œ

์ € ์˜ค๋ฅ˜๋ฅผ ๋ณธ์ ์ด ์—†๋‹ค๊ณ  ๋ง์”€ํ•˜์‹œ๋ฉฐ  

 

์ •๋ง ๊ท€์ค‘ํ•œ ์œ ํŠœ๋ธŒ ๋งํฌ๋ฅผ ์ฐพ์•„์ฃผ์…จ๋‹ค...๐Ÿ˜ญ๐Ÿ‘๐Ÿ‘

Flutter ์• ํ”Œ ๋กœ๊ทธ์ธ์—์„œ๋„ ์ฐธ๊ณ ํ–ˆ๋˜, 

<๊ฐœ๋ฐœํ•˜๋Š” ๋‚จ์ž> ๋‹˜์˜ Flutter Firebase ํŠธ์œ„ํ„ฐ ๋กœ๊ทธ์ธ ์—ฐ๋™

 

ํ•˜ ใ… ใ…  ์ •๋ง...

์ด๊ฑฐ ์•„๋‹ˆ์˜€์œผ๋ฉด ๋‚˜๋Š” ์ง€๊ธˆ๋„ ๊ธธ์„ ์žƒ์€ ์ƒํƒœ์˜€์„๋“ฏ....๐Ÿ˜ญ๐Ÿ˜ญ

๐Ÿ‘๊ฐœ๋ฐœํ•˜๋Š” ๋‚จ์ž๋‹˜ ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ‘

 

๊ทธ๋Ÿผ  ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฌธ์„œ์™€ ๊ฐœ๋ฐœํ•˜๋Š” ๋‚จ์ž๋‹˜์˜ ์œ ํŠœ๋ธŒ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ

์ •๋ฆฌํ•ด๋ณด๊ฒ ๋‹ค --!

 

 

 

 

 


 

 

 

 

1. ํŠธ์œ„ํ„ฐ ๊ฐœ๋ฐœ์ž ํŽ˜์ด์ง€์˜ ๋‚˜์˜ ํ”„๋กœ์ ํŠธ ์•ฑ์— ๋“ค์–ด๊ฐ€์„œ callback url์„ ์„ค์ •ํ•ด์ค€๋‹ค.

 

์ด ๋•Œ ์‚ฌ์šฉ์ž๋“ค์˜ email ์ฃผ์†Œ๋ฅผ ์ˆ˜์ง‘ํ•œ๋‹ค๋ฉด ์•„๋ž˜์˜ Terms of Service ์— ๋Œ€ํ•œ ์„ค๋ช…์ด ๋‚˜์™€์žˆ๋Š” url ๊ณผ,

Privacy policy ์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ์žˆ๋Š” url์„ ์ฒจ๋ถ€ํ•˜์—ฌ์•ผ ํ•œ๋‹ค! 

์—ฌ๊ธฐ์„œ๋Š” callback URL์„ callback01:// ์ด๋ผ๊ณ  ์˜ˆ๋ฅผ ๋“ค์–ด ์„ค๋ช…ํ•˜๊ฒ ๋‹ค!

 

* callback URL์€ ๋‚ด ๋งˆ์Œ๋Œ€๋กœ ์ง€์–ด๋„ ์ƒ๊ด€์—†๋‹ค!

ex) myapp://, myflutterapp://, myfluttercallback:// ๋“ฑ๋“ฑ๋“ฑ! ๋งˆ์Œ๋Œ€๋กœ!!

 

 

 

 

 

 

 

2. ๋‚ดํ”„๋กœ์ ํŠธ ํด๋” > ios > Runner > Info.plist ํŒŒ์ผ์„ ์—ฐ๋‹ค.

 

callback URL ์…‹ํŒ…์„ ํ•ด์ค˜์•ผํ•œ๋‹ค.

1๋ฒˆ์—์„œ ์…‹ํŒ…ํ•œ๊ฒƒ ์ฒ˜๋Ÿผ callback01:/์„ ์˜ˆ์‹œ๋กœ ๋“ค์–ด์„œ, ์•„๋ž˜์ฒ˜๋Ÿผ ๋„ฃ์–ด์ค€๋‹ค.

๊ฐœ๋ฐœํ•˜๋Š” ๋‚จ์ž๋‹˜์˜ ์œ ํŠœ๋ธŒ๋ฅผ ๋ณด๋‹ˆ

CFBundleURLName ๊ณผ CFBundleURLSchemes ๋ฅผ

๋˜‘๊ฐ™์ด(callback01) ์…‹ํŒ…ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ํ•œ๋‹ค!! 

<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleTypeRole</key>
    <string>Editor</string>
    <key>CFBundleURLName</key>
    <string>callback01</string>
    <key>CFBundleURLSchemes</key>
    <array>
      <!-- Registered Callback URLs in TwitterApp -->
      <string>callback01</string>
    </array>
  </dict>
</array>

 

 

 

 

 

 

3. ํŠธ์œ„ํ„ฐ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•  ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

 FlatButton(
            child: Text('Login With Twitter'),
            onPressed: () async {
              final twitterLogin = TwitterLogin(  
                apiKey: 'ํŠธ์œ„ํ„ฐ Developer Potal์˜ api key ์ž…๋ ฅ',
                apiSecretKey: 'ํŠธ์œ„ํ„ฐ Developer Potal์˜ api secret key ์ž…๋ ฅ',
                redirectURI: 'callback01://',
              );
              final authResult = twitterLogin.login();
              
              final twitterAuthCredential = TwitterAuthProvider.credential(
                accessToken: authResult.authToken!,
                secret: authResult.authTokenSecret!,
              );
  
              switch (authResult.status) {
                case TwitterLoginStatus.loggedIn:
                  // ์„ฑ๊ณตํ–ˆ์„ ๋•Œ!
                  return await FirebaseAuth.instance.signInWithCredential(authCredential);
                  break;
                case TwitterLoginStatus.cancelledByUser:
                  // ์ทจ์†Œํ–ˆ์„ ๋•Œ
                  break;
                case TwitterLoginStatus.error:
                  // error ํ„ฐ์กŒ์„ ๋•Œ!
                  break;
              }
            },
          ),

 

์ด๋ ‡๊ฒŒ ๋„ฃ์–ด์ฃผ๊ณ  ํŠธ์œ„ํ„ฐ ๋กœ๊ทธ์ธ์„ ํ•ด๋ณด๋‹ˆ ์•„~~~~~์ฃผ ์ž˜ ๋œ๋‹ค!!!!!!!!๐Ÿฅณ๐ŸŽ‰

ใ… ใ… ใ… ใ… ใ… ใ… ใ… ๋• ใ… ใ… ใ… ใ… 

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

<๊ฐœ๋ฐœํ•˜๋Š” ๋‚จ์ž> ๋‹˜์˜ Flutter Firebase ํŠธ์œ„ํ„ฐ ๋กœ๊ทธ์ธ ์—ฐ๋™

 โ˜…ํŠธ์œ„ํ„ฐ ๋กœ๊ทธ์ธ ๊ตฌํ˜„์ด ์ž˜ ์•ˆ๋œ๋‹ค๋ฉด ๊ผญ ์ฐธ๊ณ  -!! โ˜