2017-05-24 4 views
2

트윗을 게시하려고하지만 어떤 이유로 든 예상대로 작동하지 않습니다.Twitter REST API : 잘못된 인증 데이터

해당 문제는 signature 문자열과 관련이 있다고 생각하지만 트위터가 말하는대로 따라하면 signing 요청이 괜찮습니다. 여기

내 코드입니다 : 응답으로

function postTweet(user_id, AccessToken, AccessTokenSecret) { 
    var base_url = 'https://api.twitter.com/1.1/statuses/update.json', 
    oauth_nonce = randomString(), 
    oauth_signature, 
    oauth_timestamp = Math.floor(new Date().getTime()/1000), 
    reqArray, 
    req, 
    signature_base_string, 
    signing_key; 

    reqArray = [ 
    "include_entities=true", 
    'oauth_consumer_key="' + CONFIG.TWITTER_CONSUMER_KEY + '"', 
    'oauth_nonce="' + oauth_nonce + '"', 
    'oauth_signature_method="HMAC-SHA1"', 
    'oauth_timestamp="' + oauth_timestamp + '"', 
    'oauth_token="' + AccessToken + '"', 
    'oauth_version="1.0"', 
    'status=' + encodeURIComponent("hello world") 
    ]; 

    req = reqArray.sort().join('&'); 

    signature_base_string = "POST&" + encodeURIComponent(base_url) + "&" + encodeURIComponent(req); 

    signing_key = CONFIG.TWITTER_CONSUMER_KEY_SECRET + '&' + AccessTokenSecret; 

    oauth_signature = encodeURIComponent(CryptoJS.HmacSHA1(signature_base_string, signing_key).toString(CryptoJS.enc.Base64)); 

    return $http.post('https://api.twitter.com/1.1/statuses/update.json', { 
    status: 'hello world' 
    }).then(function (response) { 
    return response; 
    }).catch(function (error) { 
    console.log(error); 
    }); 
} 

enter image description here

, 내가 얻을 :

enter image description here

UPDATE

단점 내 프로젝트에 이미 $cordovaOauthUtility을 가지고 idering 내가이 방법을 사용하기 시작 :

function postTweet(accessToken, accessTokenSecret) { 
    var params, signature; 

    params = { 
    include_entities: true, 
    oauth_consumer_key: CONFIG.TWITTER_CONSUMER_KEY, 
    oauth_nonce: $cordovaOauthUtility.createNonce(10), 
    oauth_signature_method: "HMAC-SHA1", 
    oauth_token: accessToken, 
    oauth_timestamp: Math.round((new Date()).getTime()/1000.0), 
    oauth_version: "1.0" 
    }; 

    signature = $cordovaOauthUtility.createSignature('POST', 'https://api.twitter.com/1.1/statuses/update.json', params, { status: "hello" }, CONFIG.TWITTER_CONSUMER_KEY_SECRET, accessTokenSecret); 

    return $http.post('https://api.twitter.com/1.1/statuses/update.json', { 
    status: "hello" 
    }, { 
    headers: { 
     Authorization: signature.authorization_header 
    } 
    }) 
    .then(function (response) { 
     return response; 
    }).catch(function (error) { 
     console.log(error); 
    }); 
} 

enter image description here

업데이트 2

을 모든 posibilities 시도 후 문제가 지속. 여기에 내 코드가있는 plnkr을 붙여 넣습니다.

+0

dev 도구로도 요청을 추가 할 수 있습니까? –

+0

내 요청 캡처 @JonSampson을 첨부했습니다. – DevStarlight

+0

api 문서 https://dev.twitter.com/rest/reference/post/statuses/update에서 허용되는 매개 변수 중 하나 인 "include_entities"가 표시되지 않습니다. –

답변

2

암호의 HmacSHA256을 사용하고 있지만 HMAC-SHA1oauth_signature_method 매개 변수로 보내면 트위터가됩니다. 당신이 당신의 authorization 헤더를 보면

당신은 아마

oauth_signature = CryptoJS.HmacSHA1(signature_base_string, signing_key).toString(CryptoJS.enc.Base64); 

에 코드를 변경해야합니다, 당신은 또한 뭔가가 잘못된 것을 알 수 있습니다. 실제로 oauth_nonceoauth_version 앞에 & 기호가 접두사로 붙는 것을 볼 수 있습니다. 대소 문자가 아니며 지정할 필요가없는 API를 의미 할 수 있습니다. 아마도 reqArray을 사용하여 서명과 헤더를 모두 생성했거나 코드가 업데이트되지 않았을 것입니다.

또 다른 요청이 다른 api에 동시에 전송되는 경우에 대비하여 앱에서 보낸 글로벌 헤더를 변경하지 않으려 고 할 수도 있습니다. 오히려이 특정 xhr에 대해서만이 authorization 헤더를 보내야합니다.

return $http.post('https://api.twitter.com/1.1/statuses/update.json', { 
    status: 'hello world', 
}, { 
    headers: { 
    Authorization: auth, 
    }, 
}) 
+0

맞았지만, 불행하게도 문제는 계속됩니다. 수정을 포함하여 코드를 업데이트했습니다. – DevStarlight

+0

약간의 정보를 추가하기 위해 답변을 업데이트했습니다. –

+0

@DevStarlight 내 편집에 나쁜 점이 있습니다. –

1

글쎄, 당신은 명확하게 요청 배열의 oauth_token을 추가하고 있지만 화면에 표시되지 않았다? params에있는 AccessToken은 정의되지 않았습니까?

편집

documentation에 따르면, 우리는 헤더에 따옴표를 추가해야합니다. 이 시도?

reqArray = [ 
    "include_entities=true", 
    'oauth_consumer_key="'+CONFIG.TWITTER_CONSUMER_KEY+'"', 
    'oauth_nonce="'+oauth_nonce+'"', 
    'oauth_signature_method="HMAC-SHA1"', 
    'oauth_timestamp="'+oauth_timestamp+'"', 
    'oauth_token="'+AccessToken+'"', 
    'oauth_version="1.0"', 
    'status='+encodeURIComponent("hello world") 
    ]; 
+0

토큰이없는 그림을 업데이트했습니다. – DevStarlight

+0

괜찮습니다. 내 대답을 업데이트했습니다. –

+0

여전히 작동하지 않지만 이제는 "잘못된 인증 된 데이터"대신 "필요한 인증"을 삭제합니다. 내 메인 이미지와 코드를 업데이트했습니다. – DevStarlight

1

Yikes.

plnkr 번들을 다운로드하고 읽기 전용 응용 프로그램 키 세트를 추가했습니다. 설정하고 변경해야만 {"request":"\/1.1\/statuses\/update.json","error":"Read-only application cannot POST."} 응답을 얻습니다. 처음에는 {"errors":[{"code":32,"message":"Could not authenticate you."}]}을 받았습니다.

서명을 만드는 중괄호 { } 사이에서 status: "hello"을 제거하십시오.

signature = $cordovaOauthUtility.createSignature('POST', 'https://api.twitter.com/1.1/statuses/update.json', params, { }, twitter.consumer_secret, twitter.access_token_secret); 

내 요청 헤더는 다음이 될 :

:authority:api.twitter.com 
:method:POST 
:path:/1.1/statuses/update.json 
:scheme:https 
accept:application/json, text/plain, */* 
accept-encoding:gzip, deflate, br 
accept-language:en-US,en;q=0.8 
authorization:OAuth  oauth_consumer_key="x",oauth_nonce="QFMmqiasFs",oauth_signature_method="HMAC-SHA1",oauth_token="y",oauth_timestamp="1496340853",oauth_version="1.0",oauth_signature="7Ts91LKcP%2FrYsLcF5WtryCvZQFU%3D" 
content-length:18 
content-type:application/json;charset=UTF-8 
origin:http://localhost 
referer:http://localhost/twits/ 
user-agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 

인터넷 검색은 결국 자습서를 알려준 : Displaying the Twitter Feed within Your Ionic App. 나는 그의 일반적인 createTwitterSignature 함수가 매개 변수를 취하지 않고 비슷한 방식으로 코드를 수정했다고 언급했다.

function createTwitterSignature(method, url) { 
    var token = angular.fromJson(getStoredToken()); 
    var oauthObject = { 
     oauth_consumer_key: clientId, 
     oauth_nonce: $cordovaOauthUtility.createNonce(10), 
     oauth_signature_method: "HMAC-SHA1", 
     oauth_token: token.oauth_token, 
     oauth_timestamp: Math.round((new Date()).getTime()/1000.0), 
     oauth_version: "1.0" 
    }; 
    var signatureObj = $cordovaOauthUtility.createSignature(method, url, oauthObject, {}, clientSecret, token.oauth_token_secret); 
    $http.defaults.headers.common.Authorization = signatureObj.authorization_header; 
} 

나는 /이 다른 매개 변수가 안되는 이유에 대해 충돌하는 것을 읽었습니다,하지만 난 서명이 단지 접근의 기초가 될 예정이다 당신이 원하는 모든 작업에 해시하지 않는 생각 수행하려면 - Understanding Request Signing For Oauth 1.0a Providers을 참조하십시오.

+1

마침내 그것은 서명에 배치 된 매개 변수 사이의 충돌이었습니다! 작동하도록했습니다. 감사합니다! – DevStarlight