상세 컨텐츠

본문 제목

[Flutter] API Key나 다른 민감 정보 분리 - DOTENV

플러터/라이브러리

by 감자 바보 2024. 12. 16. 16:53

본문

반응형

DOTENV

flutter_dotenv | Flutter package

Flutter pub에 추가

flutter pub add flutter_dotenv

.env 파일 생성 및 데이터 저장

OPENAI_API_KEY=my_api_key

api key나 함부로 공유되어선 안되는 정보를 저장

pubspec.yaml 수정

pubspec.yaml

#아래 코드는 .env 파일이 루트 폴더에 위치할 경우임
  assets:
    - .env

적용

main.dart

import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter/material.dart';

void main async {
	//앱 실행시 dotenv 초기화
  await dotenv.load();
  runApp(const MyApp());
}

api 키 가져오기

class ApiService {
  final String apiKey = dotenv.env['OPENAI_API_KEY'] ?? '';
}

dotenv.env 키워드를 통해 저장한 값을 가져올 수 있다. 만약 실패할 경우 null을 반환한다.

 

AndoridManifest에 적용하기

api 키를 사용하는 곳은 dart 코드 외에도 Android 폴더의 AndroidManifest 등 다양하다. AndroidManifest 파일에서 이를 사용하는 방식에 대해 소개한다.

 

카카오톡 로그인 api를 예시로 설명한다.

 

아래의 코드는 카카오 로그인을 위한 AndroidManifest 코드이다.

<activity 
            android:name="com.kakao.sdk.flutter.AuthCodeCustomTabsActivity"
            android:exported="true">
            <intent-filter android:label="flutter_web_auth">
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <!-- "kakao${YOUR_NATIVE_APP_KEY}://oauth" 형식의 앱 실행 스킴 설정 -->
                <!-- 카카오 로그인 Redirect URI -->
                <data android:scheme="kakao${YOUR_NATIVE_APP_KEY}" android:host="oauth"/>
            </intent-filter>
        
            <!-- Don't delete the meta-data below.
                 This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
            <meta-data
                android:name="flutterEmbedding"
                android:value="2" />
        </activity>

 

kakao${YOUR_NATIVE_APP_KEY} 에서 YOUR_NATIVE_APP_KEY 와 같이 추후 교체되는 부분을 Placeholder라고 한다.

 

Placeholder를 정상적으로 교체하기 위해선 아래의 설정들이 필요하다.

 

app 수준의 build.gradle 설정

def dotenv = new Properties()

def envFile =  file("${rootProject.projectDir}/../.env")
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}

if (envFile.exists()) {
    envFile.withInputStream { stream -> dotenv.load(stream) }
} else {
    throw new FileNotFoundException("Could not find .env file at: ${envFile.path}")
}

 

rootProject.projectDir 은 Gradle 파일의 루트 디렉토리를 의미하며 android 폴더의 위치이다. 이를 참고하여 자신의 env 폴더 위치로 설정해준다.

 

이후 app 수준의 build.gradle 내부 defaultConfig 내부에 아래 코드를 작성한다.

 

        def kakaoKey = dotenv['KAKAO_NATIVE_APP_KEY']
        if (kakaoKey == null) {
            throw new GradleException("KAKAO_NATIVE_APP_KEY not found in .env file")
        }
        manifestPlaceholders += [YOUR_NATIVE_APP_KEY: kakaoKey]

오류

Attribute application@name at AndroidManifest.xml:4:9-42 requires a placeholder substitution but no value for <applicationName> is provided.

 

위와 같은 오류가 발생했다면 아래와 같이 코드를 변경해준다.

[변경 전]

        manifestPlaceholders = [YOUR_NATIVE_APP_KEY: kakaoKey]

[변경 후]

        manifestPlaceholders += [YOUR_NATIVE_APP_KEY: kakaoKey]
728x90
반응형

관련글 더보기