// LoginURL returns a URL that the user is to be directed to for login. func LoginURL(w http.ResponseWriter, r *http.Request) string { // Check for a session id, if not there then assign one, and add it to the redirect URL. session, err := r.Cookie(SESSION_COOKIE_NAME) state := "" if err != nil || session.Value == "" { state, err = util.GenerateID() if err != nil { glog.Errorf("Failed to create a session token: %s", err) return "" } cookie := &http.Cookie{ Name: SESSION_COOKIE_NAME, Value: state, Path: "/", HttpOnly: true, Expires: time.Now().Add(365 * 24 * time.Hour), } http.SetCookie(w, cookie) } else { state = session.Value } redirect := r.Referer() if redirect == "" { redirect = "/" } // Append the current URL to the state, in a way that's safe from tampering, // so that we can use it on the rebound. So the state we pass in has the // form: // // <sessionid>:<hash(salt + original url)>:<original url> // // Note that the sessionid and the hash are hex values and so won't contain // any colons. To break this up when returned from the server just use // strings.SplitN(s, ":", 3) which will ignore any colons found in the // Referral URL. // // On the receiving side we need to recompute the hash and compare against // the hash passed in, and only if they match should the redirect URL be // trusted. state = fmt.Sprintf("%s:%x:%s", state, sha256.Sum256([]byte(cookieSalt+redirect)), redirect) return oauthConfig.AuthCodeURL(state) }
// LoginURL returns a URL that the user is to be directed to for login. func LoginURL(w http.ResponseWriter, r *http.Request) string { // Check for a session id, if not there then assign one, and add it to the redirect URL. session, err := r.Cookie(SESSION_COOKIE_NAME) state := "" if err != nil || session.Value == "" { state, err = util.GenerateID() if err != nil { glog.Errorf("Failed to create a session token: %s", err) return "" } cookie := &http.Cookie{ Name: SESSION_COOKIE_NAME, Value: state, Path: "/", HttpOnly: true, Expires: time.Now().Add(365 * 24 * time.Hour), } http.SetCookie(w, cookie) } else { state = session.Value } return oauthConfig.AuthCodeURL(state) }