1. naver ๊ฐ๋ฐ์ ์ค์
https://developers.naver.com/apps/#/register?api=nvlogin
์ ํ๋ฆฌ์ผ์ด์ - NAVER Developers
developers.naver.com
- ์ ํ๋ฆฌ์ผ์ด์ ๋ฑ๋ก
- ์๋๋ก์ด๋ ์ค์
๋ค์ด๋ก๋ url : https://play.google.com/store/ (์์ง ๋ฑ๋กํ url์ด ์์ผ๋ฏ๋ก ์ฐ์ ์ด๋ ๊ฒ ์ ๋ ฅํด์ค๋๋ค.)
์ฑ ํจํค์ง ์ด๋ฆ : (android/app/src/main/AndroidManifest.xml ์์ ํจํค์ง ๋ช ์ ๊ฐ์ ธ์ ๋ณต๋ถํฉ๋๋ค.)
- iOS ์ค์
๋ค์ด๋ก๋ url : https://www.apple.com/kr/app-store/ (์ด๊ฒ๋ ์์ง ์์์ผ๋ก ์ผ๋จ ์ ๋ ฅํด์ค๋๋ค.)
URL Scheme : ๋ก๊ทธ์ธ ํ Callback์ ์ ๋ฌ๋ฐ์ URL-Scheme๋ฅผ ์ ๋ ฅํฉ๋๋ค.
ํ์ํ ์ ๋ณด๋ค์ด๋ ๊ธฐ์ตํด์ค๋๋ค.
- Client Name (์ค์ ํ ์ฑ ์ด๋ฆ) : ${app_name}
- Client ID : ${clientId}
- Client Secret : ${client_secret}
- URL Scheme (iOS) : ${url_scheme}
2. ํจํค์ง ์ค์น
flutter_naver_login: ^1.6.0
https://pub.dev/packages/flutter_naver_login
flutter_naver_login | Flutter Package
A Flutter plugin for using the native Naver Login SDKs on Android and iOS.
pub.dev
3 . ์๋๋ก์ด๋ ์ค์
android/app/src/main/res/values/strings.xml
์์์ ๊ธฐ์ตํด๋ ์ ๋ณด๋ค์ ์ ๋ ฅํด์ค๋๋ค.
<?xml version="1.0" encoding="utf-8"?>
<resources>
...
<!-- naver login -->
<string name="client_id">${client_id}</string>
<string name="client_secret">${client_secret}</string>
<string name="client_name">${app_name}</string>
</resources>
android/app/src/main/AndroidManifest.xml
<application
...
<meta-data
android:name="flutterEmbedding"
android:value="2" />
<!-- ์๋์ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ค๋๋ค. -->
<meta-data
android:name="com.naver.sdk.clientId"
android:value="@string/client_id" />
<meta-data
android:name="com.naver.sdk.clientSecret"
android:value="@string/client_secret" />
<meta-data
android:name="com.naver.sdk.clientName"
android:value="@string/client_name" />
...
4 . iOS ์ค์
info.plist ์ค์ ์ ์๋์ ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
์์์ ๊ธฐ์ตํด๋ ์ ๋ณด๋ค์ ์ ๋ ฅํด์ค๋๋ค.
${...} ์ธ ๋ถ๋ถ ๋ค๋ง ๋ฐ๊พธ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
<plist version="1.0">
...
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>${url_scheme}</string>
</array>
</dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>naversearchapp</string>
<string>naversearchthirdlogin</string>
</array>
<key>naverServiceAppUrlScheme</key>
<string>${url_scheme}</string>
<key>naverConsumerKey</key>
<string>${client_id}</string>
<key>naverConsumerSecret</key>
<string>${client_secret}</string>
<key>naverServiceAppName</key>
<string>${app_name}</string>
<!-- http allows configurations -->
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>naver.com</key>
<dict>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
<key>naver.net</key>
<dict>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
...
</dict>
</plist>
ios/Runner/AppDelegate.swift
/// ... ์ /// ๋ก ๋๋ฌ์์ธ ๋ถ๋ถ์ ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
import UIKit
import Flutter
/// naver ๋ก๊ทธ์ธ import ์ถ๊ฐ
import NaverThirdPartyLogin
///
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
/// ์๋์ ์ฝ๋ ์ถ๊ฐ
override func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
var applicationResult = false
if (!applicationResult) {
applicationResult = NaverThirdPartyLoginConnection.getSharedInstance().application(app, open: url, options: options)
}
// if you use other application url process, please add code here.
if (!applicationResult) {
applicationResult = super.application(app, open: url, options: options)
}
return applicationResult
}
///
}
5. ์ฝ๋ ์์ฑ
import 'package:flutter/material.dart';
import 'package:flutter_naver_login/flutter_naver_login.dart';
class NaverLoginView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('๋ค์ด๋ฒ ๋ก๊ทธ์ธ')),
body: _buildBody(context),
);
}
Widget _buildBody(BuildContext context) {
return Container(
padding: EdgeInsets.all(24),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
children: [
_loginBtn(context),
Padding(padding: EdgeInsets.all(8)),
_logoutBtn(context)
],
),
);
}
// ๋ก๊ทธ์ธ ๋ฒํผ
Widget _loginBtn(BuildContext context) {
return GestureDetector(
onTap: () {
_tapLoginBtn(context);
},
child: Container(
decoration: const BoxDecoration(
color: Color.fromRGBO(3, 199, 90, 1),
borderRadius: BorderRadius.all(Radius.circular(8)),
),
padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 24),
child: Row(
children: [
SizedBox(
width: 40,
child: Image.asset('assets/auth/naver_logo_icon.png')),
const Padding(padding: EdgeInsets.all(4)),
const Text(
'๋ค์ด๋ฒ๋ก ๋ก๊ทธ์ธํ๊ธฐ',
style: TextStyle(
fontSize: 16, color: Color.fromARGB(255, 25, 22, 22)),
),
],
),
),
);
}
// ๋ก๊ทธ์์ ๋ฒํผ
Widget _logoutBtn(BuildContext context) {
return TextButton(
onPressed: () {
_tapLogoutBtn(context);
},
child: Text('๋ก๊ทธ์์'),
);
}
// ๋ก๊ทธ์ธ
void _tapLoginBtn(BuildContext context) async {
NaverLoginResult loginResult = await FlutterNaverLogin.logIn();
print(loginResult.account.email);
print(loginResult.account.birthday);
print(loginResult.account.nickname);
print(loginResult.account.mobile);
NaverAccessToken accessToken = await FlutterNaverLogin.currentAccessToken;
print(accessToken.accessToken);
}
// ๋ก๊ทธ์์
void _tapLogoutBtn(BuildContext context) async {
NaverLoginResult loginResult = await FlutterNaverLogin.logOut();
print(loginResult.account.email);
print(loginResult.account.birthday);
print(loginResult.account.nickname);
print(loginResult.account.mobile);
}
}
6. ๋ค์ด๋ฒ ๋ก๊ทธ์ธ ๋ฒํผ ๋์์ธ ๊ฐ์ด๋
https://developers.naver.com/docs/login/bi/bi.md
๋ก๊ทธ์ธ ๋ฒํผ ์ฌ์ฉ ๊ฐ์ด๋ - LOGIN
๋ค์ด๋ฒ ๋ก๊ทธ์ธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํ ์ ์๋ ๋ค์ด๋ฒ ๋ก๊ทธ์ธ ๋ฒํผ ๊ธฐ๋ณธ ์ด๋ฏธ์ง๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํฉ์ ๋ง๊ฒ ๋ฒํผ ์ด๋ฏธ์ง์ ๋์์ธ์ ๋ณ๊ฒฝํ ์ ์์ง๋ง ๋ค์ด๋ฒ ๊ณ ์ ์ ์์ด๋ด
developers.naver.com
7. kakao && naver ์ฌ์ฉ ์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์
https://velog.io/@tygerhwang/FLUTTER-Kakao-Login-Issue
[FLUTTER] Kakao Login Issue
Kakao Login Issue
velog.io
'๐พ ๊ฐ๋ฐ ๐พ > Flutter' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Flutter] Incorrect use of ParentDataWidget Error in Flutter (0) | 2022.09.05 |
---|---|
[Flutter] Searching for inspections failed: undefined method `map' for nil:NilClass (0) | 2022.08.22 |
[Flutter] ... duplicate symbols for architecture ... ์๋ฌ (0) | 2022.08.11 |
[Flutter] ์นด์นด์ค ๋ก๊ทธ์ธํ๊ธฐ (iOS/Android) (1) | 2022.08.04 |
[Flutter] iOS ์ฒซ ๋น๋ (0) | 2022.08.04 |