Я изучаю аутентификацию 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 неверен.
Любая помощь приветствуется!