我创建了一个测试应用程序,我想在其中使用 GitHub Oauth 流程,示例代码在这里:路由是这样的:

let webApp =
    logRequest >=> choose [
        GET >=> 
            choose [
                route "/" >=> indexHandler "world"
                route "/login" >=> loginHandler
                route "/signin-github" >=> signinHandler
            ]
        mustBeLoggedIn >=>
            GET >=>
                choose [
                    route "/api" >=> indexHandler "authenticated world"
                ]    
        setStatusCode 404 >=> text "Not Found" ]

当我调用 /api 时,如果将使用 /login 路由调用质询命令:

let mustBeLoggedIn : HttpHandler =
    requiresAuthentication (redirectTo true "/login")

let loginHandler = 
    challenge "GitHub"

流程启动,一切似乎都进行得很顺利,直到OnCreatingTicket事件被触发。由于某种原因,这会导致两次调用https://api.github.com/user 。我配置了一个回调路径:

options.CallbackPath <- new PathString("/signin-github")

使用 Fiddler,我可以看到上面的 url beeing 被调用,但被重定向到 /login(重定向回 GitHub,因此循环),我不知道为什么以及重定向的内容。/signin-github 不需要身份验证。我添加了一些日志记录,但唯一调用的路由是 /login,因此重定向似乎是在 Giraffe 路由完成之前。我没有任何线索。

编辑 6/14/2018:此处的工作解决方案:https ://github.com/EelcoMulder/GiraffeOAuth


函数式编程的长颈鹿频道上的某人(damukles)为我解决了这个问题,结果是少即是多的情况,我犯了一个错误。mustBeLoggedIn 处理程序应如下所示:

    let mustBeLoggedIn : HttpHandler =
        requiresAuthentication (challenge "GitHub")

并且可以删除路由“/login”和“/signin-github”,显然 auth 库处理的比以前更多。我会写一篇关于这个的博客,完成后会更新这篇文章。