我正在尝试创建一个发送和接收大文件的Web服务,作为远程备份存储解决方案的一部分。
当Web服务器收到请求时,需要在存储数据之前对其进行身份验证。
目前我正在考虑在标题中发送身份验证方法以及正文中的实际内容。相当标准。
但是我想知道,由于正文的大小,是否可以验证标题,并且可能在完全接收正文之前响应请求/删除连接,如果请求无法验证?
我还没有开始实现,但我倾向于使用Golang实现。在它前面会有一个nginx服务器,以防它有任何区别。
在我原来的问题中,也许我还不够清楚,但主要关注点应该是: 是否可以在接收整个有效负载之前确定请求是否经过身份验证,如果不是这样,可能会丢弃连接/响应?
类似..是否可以将请求解释为流,您可以在第一部分上执行操作,即使有效负载的其余部分尚未到达。
很抱歉这个混乱。
答案 0 :(得分:0)
我想知道,由于正文的大小,是否可以验证标题,并且可能在完全接收正文之前响应请求/删除连接,如果请求无法验证?< / p>
这是身份验证的工作方式:在获取请求的网址之前验证用户。
您可以通过以下任何身份验证中间件执行此操作:
有关“End-user authentication for Go web applications”中的身份验证备选方案的更多信息。
答案 1 :(得分:0)
大多数情况下,您会使用包含优质包sessions from Gorilla的会话。 但你可以在没有“het / http”包的情况下使用它。 在此示例中,有两个文件 main.go 和 index.html 进入公共文件夹
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的客户端,您可以使用函数来获取标题信息,如
<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将以合理的方式管理副本到文件。