SAFE-стек с авторизацией на github

Я пытаюсь скрыть все свое приложение за аутентификацией (я буду иметь дело с авторизацией, когда это сработает), и сейчас я хочу, чтобы каждый URL-адрес требовал входа в систему github. У меня не открывается страница входа в github.

Я попытался объединить шаблон стека SAFE и «Использование OAuth с Saturn» , но я не получаю страницу входа в github (которую я получаю, следуя только руководству Saturn), я просто получаю обычную страницу задач. Если я нажму кнопку «Добавить», сервер напечатает

      info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/1.1 POST http://localhost:8085/api/ITodosApi/addTodo application/json; charset=UTF-8 68
info: Microsoft.AspNetCore.Authentication.OAuth.OAuthHandler`1[[Microsoft.AspNetCore.Authentication.OAuth.OAuthOptions, Microsoft.AspNetCore.Authentication.OAuth, Version=3.1.11.0, Culture=neutral, PublicKeyToken=adb9793829ddae60]][12]
      AuthenticationScheme: GitHub was challenged.
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished in 10.8057ms 302 

И элемент не добавляется в список todos.

Я попытался сбрить все, кроме бита аутентификации, и по сравнению с чистым безопасным шаблоном единственные изменения, которые я сделал, это

  1. dotnet paket add Saturn.Extensions.Authorization --project src/Server/Server.fsproj
  2. Вручную понизить две зависимости в paket.lockчто в противном случае создало ошибку: Microsoft.AspNetCore.Authentication.Googleк и Microsoft.AspNetCore.Authentication.OpenIdConnectк (3.1.11)
  3. Изменить appстоимость в Server/Server.fsк следующему (для этой проблемы я создал новое приложение github auth):
      let loggedInPipeline = pipeline {
    requires_authentication (Giraffe.Auth.challenge "GitHub")
}

let loggedInView = router {
    pipe_through loggedInPipeline
    get "/" webApp
}

let appRouter = router {
    forward "" loggedInView
}

let app =
    application {
        use_router appRouter
        url "http://0.0.0.0:8085/"
        memory_cache
        use_static "public"
        use_gzip
        use_github_oauth "8cde657dfd1d3a41b9ed" "0b245e12900ff8486ade076aae07aa0deb0fd83d" "/signin-github" [("login", "githubUsername"); ("name", "fullName")]
    }

run app

URL-адрес обратного вызова для аутентификации моего приложения gitHub: http://localhost:8080/signin-github

2 ответа

Мне помогли решить эту проблему только для AzureAD. Пост в блоге можно найти здесь https://www.compositional-it.com/news-blog/safe-stack-authentication-with-active-directory-part-2/. Должно быть то же самое для github. Что мне нужно было сделать, так это внести некоторые изменения в webpack.config.js, а также build.fsx

webpack.config.js

      devServerProxy: {
    // redirect all requests to the server on port 8085
    '**': {
//...
      var CONFIG = {
    appHtmlTemplate: './src/Client/app.html',
//...
      var commonPlugins = [
    new HtmlWebpackPlugin({
        filename: 'app.html',
//...
      var CONFIG = {
    // ... other webpack config settings
    outputDir: './src/Server/public',
     // ...
          devServer: {
        // ...other dev server config settings
        writeToDisk: true
    },

Server.fs:

      let authScheme = "AzureAD"

let isDevelopment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") = Environments.Development;

let noAuthenticationRequired nxt ctx = task { return! nxt ctx }

let authChallenge : HttpFunc -> HttpContext -> HttpFuncResult =
    requiresAuthentication (Auth.challenge authScheme)

let routes =
    choose [
        route "/" >=> authChallenge >=>  htmlFile "public/app.html"
    ]

build.fsx:

      let serverPublicPath = Path.getFullName "./src/Server/public"
let clientPublicPath = Path.getFullName "./src/Client/public"
      Target.create "Clean" (fun _ ->
    Shell.cleanDir deployDir
    Shell.cleanDir serverPublicPath)
      Target.create "Run" (fun _ ->
    Shell.copyDir serverPublicPath clientPublicPath FileFilter.allFiles
    //... other commands

Вам нужно будет использовать браузер, отличный от Chrome, если вы работаете локально, например Firefox, из-за проблемы с файлами cookie, упомянутой ранее.

Рекомендуется открыть окно приватного просмотра, чтобы убедиться, что вы еще не вошли в учетную запись и т. д.

Если у вас возникли проблемы, убедитесь, что у вас есть

  • правильно настройте регистрацию вашего приложения в Active Directory в Azure
  • добавил необходимую конфигурацию AD на ваш сервер в appsettings.json, включая URL-адреса обратного вызова для входа/выхода из системы, которые вы указали при регистрации в AD.

ты пытался httpsвместо httpдля тебя urlпараметр?

Заменять

      url "http://0.0.0.0:8085"

с

      url "https://0.0.0.0:8085"

Это решило проблему для меня.

Демонстрационный код: https://github.com/functionalfriday/fsharp-saturn-demos .

Другие вопросы по тегам