Cook ie не возвращается с последующими вызовами REST на Go Server - PullRequest
0 голосов
/ 24 января 2020

Я изучаю аутентификацию OAuth2 и настраиваю сервер, который аутентифицируется с помощью Github. Я последовал этому примеру и смог заставить его работать. Я хотел бы продолжить с некоторыми предложениями и реализовать систему токенов сеанса basi c и выполнять вызовы Github с моего сервера, а не посылать токен авторизации клиенту.

Вот мой слегка измененный / oauth / обработчик перенаправления

func oauthRedirectHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Println("/oauth/redirect")

    err := r.ParseForm()
    if err != nil {
        fmt.Fprintf(os.Stdout, "could not parse query: %+v", err)
        w.WriteHeader(http.StatusBadRequest)
    }

    code := r.FormValue("code")

    reqURL := fmt.Sprintf("https://github.com/login/oauth/access_token?client_id=%s&client_secret=%s&code=%s", clientID, clientSecret, code)
    req, err := http.NewRequest(http.MethodPost, reqURL, nil)
    if err != nil {
        fmt.Fprintf(os.Stdout, "could not create HTTP request: %v", err)
        w.WriteHeader(http.StatusBadRequest)
    }

    req.Header.Set("accept", "application/json")

    res, err := httpClient.Do(req)
    if err != nil {
        fmt.Fprintf(os.Stdout, "could not send HTTP request: %+v", err)
        w.WriteHeader(http.StatusInternalServerError)
    }
    defer res.Body.Close()

    var t oAuthAccessResponse
    if err := json.NewDecoder(res.Body).Decode(&t); err != nil {
        fmt.Fprintf(os.Stdout, "could not parse JSON response: %+v", err)
        w.WriteHeader(http.StatusBadRequest)
    }

        newSession := sessionTracker{
        AccessToken: accessToken,
        TimeOut:     time.Now().Add(time.Minute * 15),
    }

    sessionToken := uuid.New().String()

    sessionTrackerCache[sessionToken] = newSession

    http.SetCookie(w, &http.Cookie{
        Name:    sessionTokenConst,
        Value:   sessionToken,
        Expires: newSession.TimeOut,
        Domain:  "localhost",
    })

    http.Redirect(w, r, "/welcome.html", http.StatusFound)
}

Он перенаправляет на страницу приветствия с прикрепленным поваром ie, который включает мой идентификатор SessionToken.

Вот мой welcomeHandler

func welcomeHandler(w http.ResponseWriter, req *http.Request) {
    fmt.Println("/welcome")

    cookie, err := req.Cookie(sessionTokenConst)
    if err != nil {
        fmt.Fprintf(os.Stdout, "no cookie attached: %+v", err)
        w.WriteHeader(http.StatusBadRequest)
        return
    } 

    dat, err := ioutil.ReadFile("./public/welcome.html")
    if err != nil {
        fmt.Fprintf(os.Stdout, "could not read welcome page: %+v", err)
        w.WriteHeader(http.StatusInternalServerError)
    }

    fmt.Fprintf(w, string(dat))
}

Наблюдая за вкладкой сети моего браузера, я аутентифицируюсь с помощью Github, и мой сервер может видеть токен авторизации. Ответ на перенаправление в конце oauthRedirectHandler содержит повар ie с идентификатором SessionID. Моя проблема заключается в том, что браузер, похоже, не прикрепляет токен при вызове GET для /welcome.html. Я могу подтвердить это как в браузере, так и в welcomeHandler.

Все это размещено локально.

Я не уверен, является ли это проблемой с моим сервером, моим браузером или если Насколько я понимаю, файлы cookie применяются браузером к любым будущим запросам клиентов до тех пор, пока срок годности готовки ie неверен.

Любая помощь приветствуется!

1 Ответ

3 голосов
/ 24 января 2020

Браузеры по умолчанию: путь cook ie к пути запроса. Задайте путь к «/», чтобы сделать повара ie доступным по всему сайту.

Не устанавливайте домен, если у вас нет особой причины для этого (спасибо Volker за то, что вы это заметили).

http.SetCookie(w, &http.Cookie{
    Name:    sessionTokenConst,
    Value:   sessionToken,
    Path:    "/", // <--- add this line
    Expires: newSession.TimeOut,
    // Domain:  "localhost",  <-- Remove this line
})
...