下载前验证请求

时间:2014-09-02 07:16:54

标签: go request response

我正在尝试创建一个发送和接收大文件的Web服务,作为远程​​备份存储解决方案的一部分。

当Web服务器收到请求时,需要在存储数据之前对其进行身份验证。

目前我正在考虑在标题中发送身份验证方法以及正文中的实际内容。相当标准。

但是我想知道,由于正文的大小,是否可以验证标题,并且可能在完全接收正文之前响应请求/删除连接,如果请求无法验证?

我还没有开始实现,但我倾向于使用Golang实现。在它前面会有一个nginx服务器,以防它有任何区别。

编辑:

在我原来的问题中,也许我还不够清楚,但主要关注点应该是: 是否可以在接收整个有效负载之前确定请求是否经过身份验证,如果不是这样,可能会丢弃连接/响应?

类似..是否可以将请求解释为流,您可以在第一部分上执行操作,即使有效负载的其余部分尚未到达。

很抱歉这个混乱。

3 个答案:

答案 0 :(得分:0)

  

我想知道,由于正文的大小,是否可以验证标题,并且可能在完全接收正文之前响应请求/删除连接,如果请求无法验证?< / p>

这是身份验证的工作方式:在获取请求的网址之前验证用户

您可以通过以下任何身份验证中间件执行此操作:

有关“End-user authentication for Go web applications”中的身份验证备选方案的更多信息。

答案 1 :(得分:0)

大多数情况下,您会使用包含优质包sessions from Gorilla的会话。 但你可以在没有“het / http”包的情况下使用它。 在此示例中,有两个文件 main.go index.html 进入公共文件夹

服务器端go(main.go)

package main

import (
    "fmt"
    "github.com/gorilla/mux"
    "log"
    "net/http"
)

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/get/token", getTokenHandler)
    r.HandleFunc("/send/token", sendTokenHandler)
    r.PathPrefix("/").Handler(http.FileServer(http.Dir("./public/")))
    http.Handle("/", r)
    log.Println("Listening...")
    http.ListenAndServe(":3000", nil)
}

func getTokenHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Add("secret-token", "abcd")
    fmt.Fprint(w, "abcd")
}

func sendTokenHandler(w http.ResponseWriter, r *http.Request) {
    mySecret := r.Header.Get("secret-token")
    if mySecret != "abcd" {
        w.Header().Add("response-to-token", "false")
        fmt.Fprint(w, "you are not allowed")
    } else {
        w.Header().Add("response-to-token", "true")
        fmt.Fprint(w, "you are allowed")
    }
}

在javascript的客户端,您可以使用函数来获取标题信息,如

客户端使用JS(public / index.html)

<html>
    <head>
        <meta charset="utf-8">
        <title>Upload</title>
        <script type="text/javascript">

            var getSecret = function (){
                var req = new XMLHttpRequest();
                req.open('GET', "get/token", false);
                req.send();
                var secretToken = req.getResponseHeader("secret-token");
                document.getElementById('secretInput').value = secretToken;
            }

            var postSecret = function(){
                var secret = document.getElementById('secretInput').value;
                var req = new XMLHttpRequest();
                req.open('POST', "send/token", false);
                req.setRequestHeader("secret-token", secret);
                req.send();
                var responseToken = req.getResponseHeader("response-to-token");
                console.log(responseToken);
            }
            </script>
        </head>
        <body>
            <button onclick="getSecret()" >get Secret</button>
            <hr>
            <input id="secretInput" type="text"></input>
            <button onclick="postSecret()">post Secret</button>
        </body>
</html>

最后拆分文件

如果您的文件非常大,您可能需要将其分成几部分,以便在令牌不正确时发送消息。对于拆分部分,您可以使用Javascript。我刚刚在js on stackoverflow

中找到了解决方案

答案 2 :(得分:0)

如果您将文件作为请求正文发布,则可以使用auth标头进行验证,而无需等待文件完全上传。

然后,您可以使用io.Copy从请求正文复制到文件。

_, err := io.Copy(someFile, req.Body)

不要使用&multi39 / form-data&#39;如果你这样做,http pkg会妨碍你。将文件作为正文发布将允许您以流的形式访问请求正文的内容,io.Copy将以合理的方式管理副本到文件。