2016-12-23 2 views
0

Я пытаюсь выполнить вход с учетной записью twitter в golang. Я первый шаг, когда я пытаюсь получить токен запроса. В качестве ссылки я использовал код mrjones, доступный по ссылке ниже. https://github.com/mrjones/oauth/blob/master/examples/twitterserver/twitterserver.goTwitter oauth golang получение «код»: 32, «сообщение»: «Не удалось аутентифицировать вас».

Я получаю следующее сообщение об ошибке. Пожалуйста, дайте мне знать, где я буду неправильно:

{ "ошибки": [{ "код": 32, "сообщение": "Не удалось аутентифицировать вас."}]}

var twitterConf = &TwitterConfig{ 
    ClientID:  " my consumer key", 
    ClientSecret: "my consumer key secret", 
    RedirectURL: "http://localhost:8080/oauth/twitterOauth2callback", 

    Endpoint: ServiceProvider{ 
     RequestTokenUrl: "https://api.twitter.com/oauth/request_token", 
     AuthorizeTokenUrl: "https://api.twitter.com/oauth/authorize", 
     AccessTokenUrl: "https://api.twitter.com/oauth2/token", 
    }, 
} 

func HandletwitterLogin(res http.ResponseWriter, req *http.Request, _ httprouter.Params) { 

    ctx := appengine.NewContext(req) 

    params := url.Values{} 
    params.Add(CALLBACK_PARAM, twitterConf.RedirectURL) 
    params.Add(CONSUMER_KEY_PARAM, twitterConf.ClientID) 
    params.Add(NONCE_PARAM, strconv.FormatInt(rand.New(rand.NewSource(time.Now().UnixNano())).Int63(), 10)) 
    params.Add(SIGNATURE_METHOD_PARAM, SIGNATURE_METHOD_HMAC+"SHA1") 
    params.Add(TIMESTAMP_PARAM, strconv.FormatInt(time.Now().Unix(), 10)) 
    params.Add(VERSION_PARAM, OAUTH_VERSION) 
    params.Add("oauth_token", "my oauth token") 

    baseString := requestString("POST", twitterConf.Endpoint.RequestTokenUrl, params) 

    signature, err6 := Sign(baseString, "my token secret") 

    params.Add(SIGNATURE_PARAM, signature) 

    Url, err := url.Parse(twitterConf.Endpoint.RequestTokenUrl) 

    Url.RawQuery = params.Encode() 
    firsturl := Url.String() 

    reqnew, err2 := http.NewRequest("POST", firsturl, nil) 
    if err2 != nil { 
     log.Errorf(ctx, "ERROR IN CREATING NEW REQUEST %+v ", err2) 
    } 

    reqnew.Header.Add("Authorization", "OAuth ") 

    client := urlfetch.Client(ctx) 

    resp, err3 := client.Do(reqnew) 
    if err3 != nil { 
     log.Errorf(ctx, "ERROR IN doing the client request %+v ", err3) 
    } 

    bodyBytes, err4 := ioutil.ReadAll(resp.Body) 
    resp.Body.Close() 
    log.Infof(ctx, "HandletwitterLogin 5 ") 
    if err4 != nil { 
     log.Errorf(ctx, "ERROR IN READALL RESP BODY %+v ", err4) 
    } 

    bodyStr := string(bodyBytes) 

//Here i am getting above mentioned error 
} 

Это другие функции, которые я использовал.

func requestString(method string, url string, params url.Values) string { 
    result := method + "&" + escape(url) 

    for key, value := range params { 
     if len(value) > 0 { 
      result += escape("&") 

      result += escape(fmt.Sprintf("%s=%s", key, value)) 
     } 
    } 
    return result 
} 

func Sign(message string, tokenSecret string) (string, error) { 
    key := escape(twitterConf.ClientSecret) + "&" + escape(tokenSecret) 

    h := hmac.New(crypto.SHA1.New, []byte(key)) 
    h.Write([]byte(message)) 
    rawSignature := h.Sum(nil) 

    base64signature := base64.StdEncoding.EncodeToString(rawSignature) 
    return base64signature, nil 
} 

ответ

0

Способна решить эту проблему. Я сделал два изменения:

  1. закодированных переменный Params перед передачей для шифрования, чтобы создать подпись

    baseString: = "POST" + "& "+ закодировать (twitterConf.Endpoint.RequestTokenUrl) +" &" + закодировать (params.Encode())

  2. Чтобы создать заголовок, я создал свою собственную строку заголовка

    headerstring := "OAuth oauth_callback=\"http%3A%2F%2Flocalhost%3A8080%2Foauth%2FtwitterOauth2callback\",oauth_consumer_key=\"consumerkey\",oauth_nonce=\"" + 
         params.Get(NONCE_PARAM) + "\",oauth_signature=\"" + escape(signature) + "\",oauth_signature_method=\"HMAC-SHA1\",oauth_timestamp=\"" + params.Get(TIMESTAMP_PARAM) + 
         "\",oauth_token=\"" + escape("oauth token") + "\",oauth_version=\"1.0\"" 
    

    reqnew.Header.Add ("Авторизация", headerstring)

Это решило проблему, и я начал получать доступ токенов

Смежные вопросы