2016-06-19 2 views
1

Что такое правильный способ использовать OAuth сПравильный пакет AppEngine Golang для поставщика oauth2

Если я использую context.Context из golang.org/x/net/context, ошибка:

"golang.org/x/net/context".Context does not implement "appengine".Context (missing Call method) 

Но если я использую appengine.Context из appengine (SDK) , ошибка:

cannot use oauth2.NewClient(c) (type *http.Client) as type "golang.org/x/net/context".Context in argument to provider.Client: 
*http.Client does not implement "golang.org/x/net/context".Context (missing Deadline method) 

, если я использую oauth2.NoContext, то ошибка времени выполнения,

Post https://accounts.google.com/o/oauth2/token: not an App Engine context 

и протестированы с использованием Go 1.4 и 1.7b3

используя этот кусок кода:

func Public_YoutubeOauth(w http.ResponseWriter, r *http.Request) { 
    c := appengine.NewContext(r) 
    provider, csrf := getOAuth(r) 
    gets, err := url.ParseQuery(r.URL.RawQuery) 
    if RenderHtmlIfError(w,err) { 
     return 
    } 
    if csrf != gets.Get(`state`) { 
     RenderHtmlError(w,`incorrect CSRF state`) 
     return 
    } 
    code := gets.Get(`code`) 
    token, err := provider.Exchange(c, code) // error here 
    if RenderHtmlIfError(w,err) { 
     return 
    } 
    RenderHtml(w,`page`,map[string]interface{`token`:token}) 
} 

provider был:

&oauth2.Config{ 
     ClientID:  `aaa`, 
     ClientSecret: `bbb`, 
     RedirectURL: url + `/foo/youtube_oauth`, 
     Scopes: []string{ 
      `openid`, 
      `email`, 
      `profile`, 
      `https://www.googleapis.com/auth/youtube`, 
     }, 
     Endpoint: google.Endpoint, 
    } 

Что правильный способ решить эту проблему ?

ответ

1

Решение:

  1. Изменить все "appengine импорт в "google.golang.org/appengine
  2. Держите использование context.Context (от golang.org/x/net/context) вместо appengine.Context
Смежные вопросы