go - 没有使用 Golang 设置 Cookie
问题描述
我有一个用于登录用户的 REST API,它在浏览器上为登录用户设置了一个 cookie,并且运行良好。问题是当用户从注册 API 完成注册时我想调用登录 API 时,所以每次一切正常但 cookie 没有设置为浏览器。
这是登录API:
var loginViaDjangoApiShim = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var t loginPost
var oldCookieToken string
decoder := json.NewDecoder(r.Body)
_:= decoder.Decode(&t)
expiration := time.Now().Add(365 * 24 * time.Hour)
flagToReturn, cookie, _:= postToApiShim(t.Username, t.Password)
if flagToReturn == "pass" {
CookieToken = generateOldCookie(authIdFromUserName.ID)
newCookieToSet := http.Cookie{Name: "ddagyeog", Value: CookieToken , Expires: expiration, Domain: COOKIE_DOMAIN, Path: "/", Secure: false, HttpOnly: true}
http.SetCookie(w, &newCookieToSet)
}
returnValues := returnLoginFlag{Flag: flagToReturn, Cookie: ""}
json.NewEncoder(w).Encode(returnValues)
})
在这里注册API:
var signUpStart = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var t StartFlowPost
decoder := json.NewDecoder(r.Body)
_:= decoder.Decode(&t)
insertIntoUser := InsertMethod(t)
flag, _ := loginOnCoppaAndNonCoppaUsersSignup(t.UserName, t.Password)
log.Println(flag)
json.NewEncoder(w).Encode(flag)
})
下面是loginOnCoppaAndNonCoppaUsersSignup
注册用户后调用登录 API。
func loginOnCoppaAndNonCoppaUsersSignup(userName, password string) (flag returnSignUpFlagCoppa, err error) {
var loginFlag returnLoginFlag
var jsonStr = []byte(`{
"username":"` + userName + `",
"password":"` + password + `"
}`)
request, _ := http.NewRequest("POST", USER_ROOT_URL+"login", bytes.NewBuffer(jsonStr))
request.Header.Set("Content-Type", "application/json")
client := &http.Client{}
response, _:= client.Do(request)
decoder := json.NewDecoder(response.Body)
if err = decoder.Decode(&loginFlag); err != nil {
return flag, err
}
if loginFlag.Flag == "pass" {
flag = returnSignUpFlagCoppa{Flag: "pass", Username: userName}
log.Println(flag)
} else {
flag := returnSignUpFlagCoppa{Flag: "error"}
log.Println(flag)
}
return flag, nil
}
解决方案
在这里,您可以从登录 URL 响应中获取 cookie,例如。
cookies := response.Cookies()
然后你必须http.SetCookie()
在注册 API 中再次设置这些 cookie。按照下面的代码。
for _, cookie := range response.Cookies() {
http.SetCookie(w, cookie)
}
推荐阅读
- websocket - 使用 webclient(websocket.js)的 ejabberd 连接失败
- git - git:如何压缩多个合并提交
- image - 从头弹起然后倒置
- nginx - 用于编译动态模块的 nginx ./configure 在哪里?
- python - UnboundLocalError:分配前引用的局部变量“med”
- ruby - 在某些情况下,红宝石空格是否敏感?
- android - Android Canvas 改变形状和文本交集的颜色
- python - 在 Python 中将嵌套的 JSON 数组转换为简单的 JSON
- javascript - 如何在 jquery Datatable 上应用 columnDefs 并将 saveState 选项设置为 true
- ruby - 使用 docker 日志在 docker 容器中看不到 ruby 进程输出