golang go-endpoints Сеанс с использованием gorilla-toolkit

Я пытаюсь реализовать обработку сеанса и объединить ее с пакетом go-endpoints!

Пакет, который я использую для обработки сеанса, - это Gorilla Sessions (github.com/gorilla/sessions), мне нужна помощь ..

Я могу сохранить cookie для клиента ... и когда я вызываю конечные точки, я вижу, что cookie отправляется на сервер.

Проблема, когда я пытаюсь получить значения сеанса из хранилища сеанса, пока вызывается api, я не могу попасть в cookie ... похоже, что пакет конечных точек удаляет http.Request из дополнительного содержимого или чего-то еще ...?

Место, где я пытаюсь получить cookie, находится на сервере Server.go по адресу

func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request){

     var store = sessions.NewCookieStore([]byte("secret123"));

     session, _ := store.Get(r, "session-name");

     // Get the previously flashes, if any.

     c.Infof("foo value is : %v",r.Cookies());

     if flashes := session.Flashes(); len(flashes) > 0 {

     // Just print the flash values.

     c.Infof("this is the testing post message with cookie from the ServeHTTP    : 
      %v",flashes);
      } 

      else {

      // Set a new flash.

      session.AddFlash("Hello, flash messages world!")

      c.Infof("No flashes found.");

      }

      session.Save(r, w)

      }

я получаю пустой массив .... :(

у кого-то есть зацепка?

БЛАГОДАРНОСТЬ !!!!!


person Jonathan Pick    schedule 19.03.2015    source источник
comment
Не игнорируйте ошибку. Проверьте, о чем он говорит. Это, и ваша переменная магазина обновляется при каждом запросе. Он должен быть глобальным (простым) или определяться в контексте всего приложения.   -  person elithrar    schedule 19.03.2015
comment
OK ! Я попробую это и выложу обновление! Спасибо!   -  person Jonathan Pick    schedule 19.03.2015


Ответы (1)


Хорошо, ооочень, я неправильно понял идею о конечных точках, я думаю .. Я новичок в Голанге (~ год) ..

Я хотел написать что-нибудь о том, что я нашел и как обезопасил свой API.

Первым шагом будет выполнение инструкций пакета go-endpoints о том, как зарегистрироваться и обнаружить api по адресу: https://github.com/GoogleCloudPlatform/go-endpoints. Этот пакет является наиболее близким к конечным точкам движка приложений Google, использующим Java или Python ..

Теперь предположим, что api подключены и доступны для обнаружения. если мы не будем использовать oauth2 для защиты api, они будут обнаружены и предоставят доступ всем пользователям ... и это то, что я хотел бы одобрить только в моем общедоступном API, а не в моем частном ... поэтому я попробовал сеанс гориллы, думая, что это решит моя проблема ..

Что я сделал, так это попытался прослушать входящие вызовы api, обернув промежуточным программным обеспечением все вызовы маршрутов, передающие "/ _ah / api / ....", вы можете себе представить ... мне потребовалась целая вечность, чтобы понять, что этот путь зарезервирован для google api и что я могу делать то, что пытался ... в конце концов ... я получил это ... тесто позже, чем когда-либо ...

Так что к делу, после того, как вы раскрыли API, дайте ему имена и все, что вы должны использовать info.ClientIds, info.Scopes.

пример кода ---->

const (
dummyClientID = "google appengine client id" 
dummyScope1   = "https://www.googleapis.com/auth/plus.login"
dummyScope2   = "https://www.googleapis.com/auth/plus.me"
dummyScope3   = "https://www.googleapis.com/auth/userinfo.email"
dummyScope4   = "https://www.googleapis.com/auth/userinfo.profile"
dummyAudience = "people"
)

var (
emptySlice = []string{}
clientIDs  = []string{dummyClientID}  // this is the clientId of the project
scopes     = []string{dummyScope1,dummyScope2,dummyScope3,dummyScope4} // >this are the req oauth2 scopes that the user hase to approve.
audiences  = []string{dummyAudience} // this is only for android !
)


info := manageApi.MethodByName("GetBusinessById").Info()
info.Name, info.HTTPMethod, info.Path, info.Desc = "GetBusinessById",   >"POST","GetBusinessById", "Get the business if bid is sent."
info.ClientIds, info.Scopes = clientIDs, scopes  

теперь все, что осталось сделать, это создать функцию api endpoint.NewContext и запросить соответствующую область видимости для получения user.User ..

 func (ms *ManageService) GetBusinessById(r *http.Request, req >*JsonInGetBusinessById, resp *JsonOutEditBusiness) error {
 // go get the business by bid.
 DalInst := ManageDataAccessLayer.DALManagerFactory()

 context := endpoints.NewContext(r)

 u,err := >context.CurrentOAuthUser("https://www.googleapis.com/auth/userinfo.email")
 if err != nil {
     return err
 }else {

   var businessObj = DalInst.GetBusinessByBid(context, req.BidStr)


  resp.BidStr = u.Email //just for testing to see if the client is auth and >we can get client Email..

   resp.NameStr = businessObj.NameStr
   resp.AddressStr = businessObj.AddressStr
   resp.DescriptionStr = businessObj.DescriptionStr
   resp.DescriptionTwo = businessObj.DescriptionTwo
   resp.PhoneNumberStr = businessObj.PhoneNumberStr

   return nil

}

хорошо .. надеюсь, я кое-что прояснил!

person Jonathan Pick    schedule 24.03.2015