使用带有 github 操作的 Flutter Web 时如何访问机密
Posted
技术标签:
【中文标题】使用带有 github 操作的 Flutter Web 时如何访问机密【英文标题】:How to access secrets when using flutter web with github actions 【发布时间】:2021-08-29 23:56:09 【问题描述】:我有一个颤振的网络应用程序,为了访问数据库,我在 secrets.dart
文件中硬编码了一个 APIKey,这非常好。我已将此文件添加到.gitignore
,以防止其将其推送到版本控制。但是在使用 GitHub 操作部署应用程序时,脚本会失败,因为它没有检测到机密文件。
我确实在 Github 上查看了 Encrypted secrets 上的文档,该文档基本上允许存储秘密。但似乎这些秘密只能在 yml 文件中访问。
我想知道如何在我的应用程序中使用此密钥,以便我的脚本成功运行并部署应用程序。 这是我的文件夹结构
lib/
services/
database.dart /// this file uses the APIkey from secrets.dart
secrets.dart /// contains the APIkey
我能想到的解决此问题的一种方法是使用.env
文件,但我不太熟悉如何通过 CI 脚本在 .env 文件中添加密钥。我相信这也能解决我的问题。
这是我的 CI 脚本
# This file was auto-generated by the Firebase CLI
# https://github.com/firebase/firebase-tools
name: Deploy to Firebase Hosting on merge
"on":
push:
branches:
- master
jobs:
build_and_deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-java@v1
with:
java-version: "12.x"
- uses: subosito/flutter-action@v1
with:
channel: "master"
- run: flutter pub get
- run: flutter pub run build_runner build --delete-conflicting-outputs
- run: flutter build web --release
- uses: FirebaseExtended/action-hosting-deploy@v0
with:
repoToken: "$ secrets.GITHUB_TOKEN "
firebaseServiceAccount: "$ secrets.FIREBASE_SERVICE_ACCOUNT_VOCABHUB_34C7F "
channelId: live
projectId: vocabhub-34c7f
env:
FIREBASE_CLI_PREVIEWS: hostingchannels
【问题讨论】:
【参考方案1】:如果您使用的是 Environment Secrets 而不是 Repository Secrets,您应该定义您将使用什么环境,检查一下
jobs:
build:
environment: **ENVIRONMENT NAME HERE**
steps:
- name: blah blah
run: echo blah blah
【讨论】:
【参考方案2】:您可以使用 secrets.dart
文件,同时在源代码管理中被忽略。
这里是步骤
-
在您的本地计算机中,使用 base64 命令对
secrets.dart
的内容进行编码:
base64 lib/path/to/secrets.dart
将输出复制并粘贴到您的 GitHub 机密中,将其命名为 $SECRETS_FILE_CONTENT
或任何您想要的名称。
将此 CI 步骤添加到您的 yaml 脚本中,就在 flutter pub get
步骤之前。
# other stuff ...
- run: echo $SECRETS_FILE_CONTENT | base64 -d > lib/path/to/secrets.dart
env:
SECRETS_FILE_CONTENT: $ secrets.SECRETS_FILE_CONTENT
- run: flutter pub get
- run: flutter pub run build_runner build --delete-conflicting-outputs
- run: flutter build web --release
# other stuff ...
要在 GitHub 用户界面中添加密钥,请按以下步骤操作:
您的密码应出现在 UI 的下半部分“存储库密码”中,不应出现在“环境密码”中,因为这些密码不适用于简单的 $ secrets.name_of_variable
。
为了提供更多上下文,这里是“操作”文件,例如.github/workflows/ci.yml 在您的存储库中,应如下所示:
name: CI
on:
push:
branches: [ main, dev ]
pull_request:
branches: [ main ]
# Allows to run this workflow manually from the Actions tab
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Decode base64 secrets
run: echo $SECRETS_FILE_CONTENTS | base64 -d > lib/path/to/secrets.dart
env:
SECRETS_FILE_CONTENTS: $ secrets.SECRETS_FILE_CONTENTS
# … put your steps here
- name: Do stuff
run: flutter pub get
编辑
当人们使用 firebase 时隐藏 google-services.json
时,这也是相同的过程。或者使用签名密钥(key.jks
或 key.keystore
)。
【讨论】:
该死!这似乎奏效了。你能解释一下这一步是做什么的run: echo $SECRETS_FILE_CONTENT | base64 -d > lib/utils/secrets.dart
它是在创建一个包含内容的文件吗?
是的。该行将解码并将输出写入指定的文件路径。
非常感谢,这是我见过的最简单、最安全的解决方案之一(AFAIK),我不确定为什么没有人提到这一点。无论如何,我想为这个出色的答案提供赏金,我将再等两天。
恭喜获得赏金以上是关于使用带有 github 操作的 Flutter Web 时如何访问机密的主要内容,如果未能解决你的问题,请参考以下文章
是啥导致“权限被拒绝”-带有 FIREBASE 和 FLUTTER 的消息