在哪里/如何存储或生成客户端机密?

时间:2021-04-21 11:23:50

标签: c# google-api youtube-api google-oauth youtube-data-api

我将 C# .NET 与 YouTubeAPI-Nuget 包一起使用。

该项目是一个桌面应用程序 (Avalonia),我需要访问用户的 YouTube 频道(例如更改视频标题)。

我不明白我需要如何或在哪里存储客户端机密,或者我是否可以生成它们,或者我将如何在用户无法访问我的客户端机密的情况下分发程序。

是否每个想要使用我的程序的用户都需要一个自己的客户端机密文件?如果是这样,我如何自动生成它? (因为我不想为每个想要使用它的用户手动生成客户端机密)

如果他们只需要一个客户端机密,那么我如何在不将纯文本文件放入安装文件夹的情况下分发它?

我真的不知道,也找不到任何关于它应该如何工作的信息。

3 个答案:

答案 0 :(得分:1)

<块引用>

我不明白我需要如何或在哪里存储客户端机密,或者我是否可以生成它们,或者我将如何在用户无法访问我的客户端机密的情况下分发程序。

因为您有一个桌面应用程序,所以当您编译它时,请确保它被编译为应用程序的一部分,例如不要将 clientsecret.json 作为文件与您的应用程序一起发送,如 dll。它应该被编译到您的应用程序中并以这种方式分发。如果您想使用更多的 OTT,您可以将其存储在您的服务器上的端点上,并让您的桌面应用在运行或安装时获取它并在本地存储数据。

<块引用>

是否每个想要使用我的程序的用户都需要一个自己的客户端机密文件?如果是这样,我如何自动生成它? (因为我不想为每个想要使用它的用户手动生成客户端机密)

不,您的应用程序应该有一个可供所有用户使用的客户端 ID 和客户端密钥对。

<块引用>

如果他们只需要一个客户端机密,那么我如何在不将纯文本文件放入安装文件夹的情况下分发它?

我还没有看到您的代码,但您真正需要的是客户端 ID 和客户端机密本身作为常量存储在您的应用程序某处。您实际上并不需要文件本身。

答案 1 :(得分:1)

但是...散列或加密代码中的字符串,因为在记事本中打开可执行文件可以以明文形式公开字符串。最好是用字符串加密来混淆...

答案 2 :(得分:0)

好的,上面的答案是我的答案,但我想(用代码)分享我将如何按照他们所说的去做。

  1. 我的 CI 将获取我的客户 ID 和机密以及机密(我使用的是 Github Actions)。

  2. 我在代码中创建字符串常量:

private const string ClientId = "CLIENT_ID";
private const string ClientSecret = "CLIENT_SECRET";
  1. 让 CI 将这些代码行更改为实际的客户端 ID 和密钥
private const string ClientId = "ACTUAL_CLIENT_ID";
private const string ClientSecret = "ACTUAL_CLIENT_SECRET";
  1. 让 CI 在 dotnet publish 之后混淆生成的 dll,以便更难反编译它。 (我正在尝试让 ConfuserEx 工作)