所以我设置了一个golang rest api。登录时我会这样做:
session, _ := store.New(r, sessionId)
session.Options.MaxAge = 12 * 3600
err := session.Save(r, w)
//treat error
并且为了检查会话我已经像这样:
session, err := store.Get(r, sessionId)
//treat error
if session.IsNew {
http.Error(w, "Unauthorized session.", http.StatusUnauthorized)
return
}
如果我提出邮递员的要求,它可以正常工作,但是当我从我的客户那里做到这一点时,我得到了401.你们有没有经历过这样的事情?商店是CookieStore。
我已经检查了id,我用一个静态字符串替换了sessionId变量。 Gorilla会话使用gorilla上下文来注册一个新请求,当我发邮件context.data[r]
的请求不是null时,但是从客户端它始终为null - >总是一个新的会议。
https://github.com/gorilla/context/blob/master/context.go - 第33行
在
中调用https://github.com/gorilla/sessions/blob/master/sessions.go - 第122行
用于
中的CookieStore.Get函数https://github.com/gorilla/sessions/blob/master/store.go - 第77行
编辑1: 对于客户端我使用聚合物,我也尝试了xmlhttp。 聚合物:
<iron-ajax
id="ajaxRequest"
auto
url="{{requestUrl}}"
headers="{{requestHeaders}}"
handle-as="json"
on-response="onResponse"
on-error="onError"
content-type="application/json"
>
</iron-ajax>
和处理程序
onResponse: function(response){
console.log(response.detail.response);
this.items = response.detail.response
},
onError: function(error){
console.log(error.detail)
},
ready: function(){
this.requestUrl = "http://localhost:8080/api/fingerprint/company/" + getCookie("companyId");
this.requestHeaders = {"Set-cookie": getCookie("api_token")}
}
并且cookie成功到达后端。
和xmlhttp:
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == XMLHttpRequest.DONE ) {
if(xmlhttp.status == 200){
//do stuff
}else if(xmlhttp.status == 401){
page.redirect("/unauthorized")
}else{
page.redirect("/error")
}
}
}
xmlhttp.open("GET","http://localhost:8080/api/fingerprint/company/" + getCookie("companyId"),true);
xmlhttp.setRequestHeader("Set-cookie", getCookie("api_token"));
xmlhttp.send();
编辑2:
所以我尝试使用fiddler进行调试(感谢您的建议),我发现邮递员的请求有一个粗体条目Cookies / Login
,而客户端的请求却没有。知道如何获得/设置该值吗?它以某种方式自动设置在Postman中。在身份验证请求中,我得到一个set-cookie标头,其中包含我需要的所有数据,但我无法在客户端上获取它。我得到Refused to get unsafe header set-cookie
。
答案 0 :(得分:3)
问题是在客户端中,请求需要var resultObj = pagemaker.datatables.paginate(args);
resultObj.then(function (result) {
paginateHandler(result);
});
}
function paginateHandler (result)
{
var numPaginatedRecords = result.recordsFiltered;
var pagesTotal = Math.ceil(numPaginatedRecords / ITEMS_ON_PAGE);
res.render('my_paginated_view', {
data: result.data,
currentPage: <from URL or default 1>,
pagesCount: pagesTotal
});
};
,之后浏览器会处理所有内容。它从withCredentials = true
标头获取cookie,并通过set-cookie
标头发送cookie。所以,毕竟,这不是一个大猩猩会议问题。
答案 1 :(得分:0)
如果其他人遇到了同样的问题,并且您希望将所有域/通配符列入白名单(或者您可以扫描的阵列中包含域列表),您可以执行类似的操作。
domain_raw := r.Host
domain_host_parts := strings.Split(domain_raw, ".")
domain := domain_host_parts[1] + "." + domain_host_parts[2]
domains := getDomains() // stores a slice of all your allowable domains
has_domain := false
for _, d := range domains {
if d == domain {
has_domain = true
break
}
}
if has_domain == false {
return
} else {
w.Header().Add("Access-Control-Allow-Origin", "https://"+domain_raw)
w.Header().Add("Access-Control-Allow-Credentials", "true")
}
我喜欢去