1

これは私の最初の 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 コールバック ファイルの例が軌道に乗ると思います。

4

1 に答える 1

1

私は FitBit API を使ったことがないということを前置きしておきます。 受け取ったエラーと提供したリンクから、API は認証ヘッダーをリクエストに含める必要があります。cfhttp以下は、ColdFusion呼び出しに HTTP ヘッダーを含める方法の例です。

参照した API ドキュメントには、リクエストには次の認証ヘッダー パラメータが必要であることが記載されています。

  • oauth_callback - コールバック URL。サーバーはこの URL を保存し、後でユーザーがクライアントを承認するときにリダイレクトします。
  • oauth_consumer_key - 登録時に同意したクライアント キー。
  • oauth_nonce - サーバーがリクエストの一意性を検証できるように、クライアントによって一意に生成されたランダム文字列。
  • oauth_signature - OAuth 1.0 プロトコル セクション 3.4: 署名で説明されているように計算された署名。
  • oauth_signature_method - 署名方法: HMAC-SHA1
  • oauth_timestamp - タイムスタンプ
  • oauth_version - 1.0

彼らの例から、ColdFusion コードは次のようになります。

<cfhttp url="#oREQ.getString()#" method="get" result="tokenResponse">
    <cfhttpparam type="header" name="oauth_callback" value="http%3A%2F%2Fexample.fitbit.com%2Fapp%2FcompleteAuthorization" />
    <cfhttpparam type="header" name="oauth_consumer_key" value="fitbit-example-client-application" />
    <cfhttpparam type="header" name="oauth_nonce" value="161822064" />
    <cfhttpparam type="header" name="oauth_signature" value="Omf%2Bls2gn%2BDlghq245LRIyfMdd8%3D" />
    <cfhttpparam type="header" name="oauth_signature_method" value="HMAC-SHA1" />
    <cfhttpparam type="header" name="oauth_timestamp" value="1270248082" />
    <cfhttpparam type="header" name="oauth_version" value="1.0" />
</cfhttp>

うまくいけば、これで少し先に進むことができます。

更新パラメータを少し異なる方法で渡した他の oauth の例
に出くわしました。前の方法が機能しない場合のアプローチの例を次に示します。

<cfhttp url="#oREQ.getString()#" method="get" result="tokenResponse">
    <cfhttpparam type="header" name="content-type" value="application/x-www-form-urlencoded">
    <cfhttpparam type="oauth_callback" name="FormField" value="http%3A%2F%2Fexample.fitbit.com%2Fapp%2FcompleteAuthorization" />
    <cfhttpparam type="oauth_consumer_key" name="FormField" value="fitbit-example-client-application" />
    <cfhttpparam type="oauth_nonce" name="FormField" value="161822064" />
    <cfhttpparam type="oauth_signature" name="FormField" value="Omf%2Bls2gn%2BDlghq245LRIyfMdd8%3D" />
    <cfhttpparam type="oauth_signature_method" name="FormField" value="HMAC-SHA1" />
    <cfhttpparam type="oauth_timestamp" name="FormField" value="1270248082" />
    <cfhttpparam type="oauth_version" name="FormField" value="1.0" />
</cfhttp>
于 2014-06-10T19:05:59.513 に答える