Получение настроек OAuth из env var с полной остановкой в ​​ключе - PullRequest
1 голос
/ 17 марта 2020

Я использую контейнер docker linux для запуска моего приложения стека служб, и мне нужно иметь возможность читать ключи OAuth из переменных среды, определенных в моем docker -compose.yml.

It кажется невозможным сделать это из-за полной остановки в имени переменной.

Например, в строке OAuthProvider.cs (https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack/Auth/OAuthProvider.cs) 26:

this.ConsumerKey = appSettings.GetString($"oauth.{oAuthProvider}.{consumerKeyName}");

Например, он читает ключ oauth.google.ConsumerKey.

Linux, который не поддерживает полные остановки в переменных среды. Используя отладчик, я вижу, что если я помещу переменные в виде:

environment:
  - oauth.RedirectUrl=http://example.com
  - oauth.CallbackUrl=http://example.com/auth/{0}
  - oauth.basecamp.ConsumerKey=fgshghfdhfghgfdhf
  - oauth.basecamp.ConsumerSecret=fdghfdghdfghgdfhdfghfgd

, тогда они будут удалены. Я провел некоторое исследование, и это распространенная проблема: если env var имеет полную остановку, он удаляется. Я не могу найти обходного пути для этого.

Есть ли у вас какие-либо идеи, как я могу передать эти жестко запрограммированные настройки с помощью переменной среды docker?

Вот представление всего моего файла Docker для справки:

ARG BUILD_MODE=Release
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
RUN apt-get update && apt-get install openssh-server unzip -y 
RUN curl -sSL https://aka.ms/getvsdbgsh | /bin/sh /dev/stdin -v latest -l ~/vsdbg
COPY sshd_config /etc/ssh/
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["Project/Project.csproj", "Project/"]
COPY ["Project.ServiceModel/Project.ServiceModel.csproj", "Project.ServiceModel/"]
COPY ["Project.ServiceInterface/Project.ServiceInterface.csproj", "Project.ServiceInterface/"]
COPY ["NuGet.config", "NuGet.config"]
RUN dotnet restore "Project/Project.csproj"
COPY . .
WORKDIR "/src/Project"
RUN dotnet build "Project.csproj" -c "$BUILD_MODE" -o /app/build

FROM build AS publish
RUN dotnet publish "Project.csproj" -c "$BUILD_MODE" -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT service ssh start && echo "root:$SSH_PASSWORD" | chpasswd && dotnet Project.dll

А это docker -составить:

version: "3.7"
services:
  project:
    build:
      context: E:\project\
      dockerfile: E:\project\project\Dockerfile
    image: project:local
    ports:
      - "57008:80"
      - "57009:443"
      - "57001:2222"
    restart: always
    depends_on:
      - "db"
    environment:
      - oauth.RedirectUrl=http://example.com
      - oauth.CallbackUrl=http://example.com/auth/{0}
      - oauth.basecamp.ConsumerKey=fgshghfdhfghgfdhf
      - oauth.basecamp.ConsumerSecret=fdghfdghdfghgdfhdfghfgd
  db:
    image: postgres:10.9
    restart: always
    environment:
      POSTGRES_PASSWORD: fdgdfgdfgdf
      POSTGRES_USER: project
    ports:
      - "5445:5432"

1 Ответ

1 голос
/ 17 марта 2020

Вы можете предоставить своего собственного провайдера AppSettings или использовать DictionarySettings и заполнить его отображенной переменной среды, которая подходит для использования в Docker, например:

Использовать подчеркивание разделители в Docker:

environment:
  - oauth_RedirectUrl=http://example.com
  - oauth_CallbackUrl=http://example.com/auth/{0}
  - oauth_basecamp_ConsumerKey=fgshghfdhfghgfdhf
  - oauth_basecamp_ConsumerSecret=fdghfdghdfghgdfhdfghfgd

Затем создайте новый словарь AppSettings, используя ключи, которые ожидает ServiceStack, например:

string env(string key) => 
    Environment.GetEnvironmentVariable(key.Replace(".","_"));

var envSettings = new DictionarySettings(new Dictionary<string,string> {
    ["oauth.RedirectUrl"] = env("oauth.RedirectUrl"),
    ["oauth.CallbackUrl"] = env("oauth.CallbackUrl"),
    ["oauth.basecamp.ConsumerKey"] = env("oauth.basecamp.ConsumerKey"),
    ["oauth.basecamp.ConsumerSecret"] = env("oauth.basecamp.ConsumerSecret"),
});

Затем используйте это в ваших провайдерах аутентификации, например:

new MyAuthProvider(envSettings)
...