これは私の最初の oAuth1 プロジェクトです。FitBit の API に接続しようとしています。fitbit にアクセスし、アプリを登録して、キーとシークレットを記録しました。
次に、ダウンロードしてセットアップを試みました: http://oauth.riaforge.org/
1)SSL経由で接続しようとすると接続に失敗することがわかりました..しかし、それはキーストアの問題だと思います。http に戻ると、少なくとも接続を試みます。
2) 現在、examples_external/google.cfm ファイルのコードを使用しています。一番近い試合だったようです。
コードを実行すると、以下の応答が返されます。私は、oauth クライアントが URL のすべての値を含む get としてリンクを送信し、Fitbit が POST を必要とし、認証ヘッダーが必要であると想定しています。できる限り調査しましたが、Fitbit と Oauth を使用した CF の例が不足しています。
これが彼らが探しているものです。 https://wiki.fitbit.com/display/API/OAuth+Authentication+in+the+Fitbit+API
任意のガイダンスをいただければ幸いです。
<!--- set up the parameters --->
<cfset sConsumerKey = "xxxxx"> <!--- FromFit Bit --->
<cfset sConsumerSecret = "yyyy"> <!--- From FitBit --->
<cfset sTokenEndpoint = "http://api.fitbit.com/oauth/request_token"> <!--- Access Token URL --->
<cfset sAuthorizationEndpoint = "http://www.fitbit.com/oauth/authorize"> <!--- Authorize URL --->
<cfset sCallbackURL = "http://www.example.com/fitbit/callback.cfm"> <!--- where fitbit will redirect to after the user enters their details --->
<cfset sClientToken = ""> <!--- returned after an access token call --->
<cfset sClientTokenSecret = ""> <!--- returned after an access token call --->
<cfset sScope =''> <!--- required for google --->
<!--- set up the required objects including signature method--->
<cfset oReqSigMethodSHA = CreateObject("component", "oauth.oauthsignaturemethod_hmac_sha1")>
<cfset oToken = CreateObject("component", "oauth.oauthtoken").createEmptyToken()>
<cfset oConsumer = CreateObject("component", "oauth.oauthconsumer").init(sKey = sConsumerKey, sSecret = sConsumerSecret)>
<cfset Parameters = structNew()>
<cfset parameters.scope = sScope>
<cfset oReq = CreateObject("component", "oauth.oauthrequest").fromConsumerAndToken(
oConsumer = oConsumer,
oToken = oToken,
sHttpMethod = "GET",
sHttpURL = sTokenEndpoint,stparameters=Parameters )>
<cfset oReq.signRequest(
oSignatureMethod = oReqSigMethodSHA,
oConsumer = oConsumer,
oToken = oToken)>
<cfhttp url="#oREQ.getString()#" method="get" result="tokenResponse"/>
<!--- grab the token and secret from the response if its there--->
<cfif findNoCase("oauth_token",tokenresponse.filecontent)>
<cfset sClientToken = listlast(listfirst(tokenResponse.filecontent,"&"),"=")>
<cfset sClientTokenSecret = listlast(listlast(tokenResponse.filecontent,"&"),"=")>
<!--- you can add some additional parameters to the callback --->
<cfset sCallbackURL = sCallbackURL & "?" &
"key=" & sConsumerKey &
"&" & "secret=" & sConsumerSecret &
"&" & "token=" & sClientToken &
"&" & "token_secret=" & sClientTokenSecret &
"&" & "endpoint=" & URLEncodedFormat(sAuthorizationEndpoint)>
<cfset sAuthURL = sAuthorizationEndpoint & "?oauth_token=" & sClientToken & "&" & "oauth_callback=" & URLEncodedFormat(sCallbackURL) >
<cflocation url="#sAuthURL#">
<cfelse>
<cfoutput>#tokenResponse.filecontent#</cfoutput>
</cfif>
戻り値
{"errors":[{"errorType":"oauth","fieldName":"n/a","message":"No Authorization header provided in the request. Each call to Fitbit API should be OAuth signed"}],"success":false}
更新:同様の問題でリンクされた人に接続している誰かのために見つけた例で、もう少し先に進むことができました....更新されたコード:
<!--- set up the parameters --->
<cfset sConsumerKey = "xxxxx"> <!--- FromFit Bit --->
<cfset sConsumerSecret = "xxxxxxxx"> <!--- From FitBit --->
<cfset sTokenEndpoint = "http://api.fitbit.com/oauth/request_token"> <!--- Access Token URL --->
<cfset sAuthorizationEndpoint = "http://api.fitbit.com/oauth/authorize"> <!--- Authorize URL --->
<cfset sCallbackURL = "http://www.example.com/fitbit/callback.cfm"> <!--- where fitbit will redirect to after the user enters their details --->
<cfset sClientToken = ""> <!--- returned after an access token call --->
<cfset sClientTokenSecret = ""> <!--- returned after an access token call --->
<!--- set up the required objects including signature method--->
<cfset oReqSigMethodSHA = CreateObject("component", "oauth.oauthsignaturemethod_hmac_sha1")>
<cfset oToken = CreateObject("component", "oauth.oauthtoken").createEmptyToken()>
<cfset oConsumer = CreateObject("component", "oauth.oauthconsumer").init(sKey = sConsumerKey, sSecret = sConsumerSecret)>
<cfset Parameters = structNew()>
<cfset oReq = CreateObject("component", "oauth.oauthrequest").fromConsumerAndToken(
oConsumer = oConsumer,
oToken = oToken,
sHttpMethod = "POST",
sHttpURL = sTokenEndpoint,stparameters=Parameters )>
<cfset oReq.signRequest(
oSignatureMethod = oReqSigMethodSHA,
oConsumer = oConsumer,
oToken = oToken)>
<cfhttp url="#oReq.GETNORMALIZEDHTTPURL()#" method="post" result="tokenresponse">
<cfhttpparam type="header" name="Authorization" value="#oReq.TOHEADER()#" />
</cfhttp>
<!---
FROM HERE DOWN IS ALL FROM EXAMPLE FILE
grab the token and secret from the response if its there--->
<cfif findNoCase("oauth_token",tokenresponse.filecontent)>
<cfset sClientToken = listlast(listfirst(tokenResponse.filecontent,"&"),"=")>
<cfset sClientTokenSecret = listlast(listlast(tokenResponse.filecontent,"&"),"=")>
<!--- you can add some additional parameters to the callback --->
<cfset sCallbackURL = sCallbackURL & "?" &
"key=" & sConsumerKey &
"&" & "secret=" & sConsumerSecret &
"&" & "token=" & sClientToken &
"&" & "token_secret=" & sClientTokenSecret &
"&" & "endpoint=" & URLEncodedFormat(sAuthorizationEndpoint)>
<cfset sAuthURL = sAuthorizationEndpoint & "?oauth_token=" & sClientToken & "&" & "oauth_callback=" & URLEncodedFormat(sCallbackURL) >
<cflocation url="#sAuthURL#">
<cfelse>
<cfoutput>#tokenResponse.filecontent#</cfoutput>
</cfif>
しかし、今私はコールバックにいます....似ているように見えますが、2つの値を追加するだけだと思っていましたが、正しく追加できないようです。
<cfset sConsumerKey = ""> <!--- FromFit Bit --->
<cfset sConsumerSecret = ""> <!--- From FitBit --->
<cfset sTokenEndpoint = "http://api.fitbit.com/oauth/request_token"> <!--- Access Token URL --->
<cfset sAuthorizationEndpoint = "http://api.fitbit.com/oauth/authorize"> <!--- Authorize URL --->
<cfset sCallbackURL = "http://www.example.com/fitbit/callback.cfm"> <!--- where fitbit will redirect to after the user enters their details --->
<cfset sClientToken = "#url.oauth_token#"> <!--- returned after an access token call --->
<cfset sClientTokenSecret = "#url.oauth_verifier#"> <!--- returned after an access token call --->
<!--- set up the required objects including signature method--->
<cfset oReqSigMethodSHA = CreateObject("component", "oauth.oauthsignaturemethod_hmac_sha1")>
<cfset oToken = CreateObject("component", "oauth.oauthtoken").createEmptyToken()>
<cfset oConsumer = CreateObject("component", "oauth.oauthconsumer").init(sKey = sConsumerKey, sSecret = sConsumerSecret)>
<cfset Parameters = structNew()>
<cfset parameters.oauth_token=url.oauth_token>
<cfset parameters.oauth_verifier=url.oauth_verifier>
<cfset oReq = CreateObject("component", "oauth.oauthrequest").fromConsumerAndToken(
oConsumer = oConsumer,
oToken = oToken,
sHttpMethod = "POST",
sHttpURL = sTokenEndpoint,stparameters=Parameters )>
<cfset oReq.signRequest(
oSignatureMethod = oReqSigMethodSHA,
oConsumer = oConsumer,
oToken = oToken)>
Header:<Cfdump var="#oreq.toheader()#"><br>
<cfhttp url="http://api.fitbit.com/oauth/access_token" method="post" result="tokenresponse">
<cfhttpparam type="header" name="Authorization" value="#oReq.TOHEADER()#" />
</cfhttp>
次のエラーが返されます。
{"errors":[{"errorType":"oauth","fieldName":"oauth_access_token","message":"Invalid signature or token 'xxxxxxxxxxxxxxxxxxxxxxx' or token 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'"}],"success":false}
これは、ベリファイアとトークンがヘッダー内 (またはどこにも) 表示されていないためと思われます...
したがって、基本的には、適切な oauth コールバック ファイルの例が軌道に乗ると思います。