小编典典

使用gorilla-toolkit的golang go-endpoints会话

go

我正在尝试实现会话处理并将其与go-endpoints包结合使用!

我用来处理会话的程序包是Gorilla Sessions(github.com/gorilla/sessions),我想要一些帮助。

我能够将cookie存储到客户端..当我调用端点时,可以看到cookie已发送到服务器。

问题是,当我尝试在调用api时从Session存储中获取Session值时,我无法扔到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)

      }

我得到的是一个空数组.... :(

有人带头?

谢谢 !!!!!


阅读 253

收藏
2020-07-02

共1个答案

小编典典

好吧,我猜我对go-endpoints的想法是错误的..我对golang(〜year)很陌生。

我想写一些关于我发现的东西以及如何保护我的api的东西。

第一步将按照go-
endpoints软件包说明进行操作,有关如何注册和发现api的信息:https : //github.com/GoogleCloudPlatform/go-
endpoints,此软件包是使用google
app引擎终结点使用的最接近的软件包Java或Python ..

现在,可以说该api在线且可发现。如果我们不使用oauth2来保护api的安全,那么它们将是可发现的并授予所有用户访问权限..而且我只想在我的公共api中而不是在我的私有..中批准某些内容,因此我尝试了大猩猩会话,认为它将解决我的问题
..

我所做的是通过与中间件一起包装所有传递“ / _ah / api /
....”的路由调用来监听传入的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
>  
>
> }

好的..希望我弄清楚一些事情!

2020-07-02