0

我正在尝试将 MapMyFitness API (www.mapmyapi.com) 与 Ruby on Rails 3.2 和 oauth2 gem 一起使用。首先,我的应用在“get_auth_url”中生成 auth_url。然后浏览器导航到它,并且一旦通过身份验证,回调就会返回到“mapmyfitness_callback”。“mapmyfitness_callback”还获取“锻炼”列表,并显示在浏览器中。

问题是当用户选择要下载的锻炼时。要检索选定的锻炼,我调用“get_workout”。但是,我很难为请求获取适当的令牌。

下面的行崩溃:

workout_data = access_token.get('/v7.0/workout/' + workout_id, :params => { 'field_set' => 'time_series' }, :headers => {'Api-Key' => ENV['MMF_API_KEY'], 'Authorization' => auth_token}).body

与:OAuth2::Error (: {"oauth1_error":"Malformed authentication header","oauth1_error_code":"OAUTH1:UNKNOWN"}): app/controllers/telemetry_controller.rb:60:in `get_workout'

整个控制器代码:

require 'oauth2'

class TelemetryController < ApplicationController

  def get_auth_url  
    auth_url = mmf_client.auth_code.authorize_url(:redirect_uri => 'http://localhost:3000/telemetry/mapmyfitness_callback')

    respond_to do |format|
      format.json{ render :json => {:auth_url => auth_url}.to_json }
    end  
  end

  def mapmyfitness_callback

    # Get user
    @code = params[:code]
    token = mmf_client.auth_code.get_token(@code, :redirect_uri => 'http://localhost:3000/telemetry/mapmyfitness_callback', :headers => {'Api-Key' => ENV['MMF_API_KEY']})
    mmf_user = JSON.parse(token.get('/v7.0/user/self', :headers => {'Api-Key' => ENV['MMF_API_KEY'], 'Authorization' => @code}).body)
    mmf_user_id = mmf_user['id']

    @auth_token = token.token

    # Get workouts
    mmf_workouts = JSON.parse(token.get('/v7.0/workout', :params => { 'user' => mmf_user_id }, :headers => {'Api-Key' => ENV['MMF_API_KEY'], 'Authorization' => @code}).body)

    @workout_list = Array.new
    mmf_workouts['_embedded']['workouts'].each do |workout|
      workout_data = {:name => workout['name'],
                      :id => workout['_links']['self'][0]['id']}
      @workout_list.push(workout_data)
    end        

    render :layout => false

  end

  def get_workout

    code = params[:code]
    auth_token = params[:auth_token]

    access_token = OAuth2::AccessToken.new(mmf_client, auth_token, {
        :mode => :query,
        :param_name => "oauth2_access_token",
    })    

    puts access_token.to_yaml

    # Get workout
    workout_id = params[:workout_id]
    workout_data = access_token.get('/v7.0/workout/' + workout_id, :params => { 'field_set' => 'time_series' }, :headers => {'Api-Key' => ENV['MMF_API_KEY'], 'Authorization' => auth_token}).body

    respond_to do |format|
      format.json{ render :json => {:mmf_workout_data => workout_data}.to_json }
    end

  end

  private

  def mmf_client

    client = OAuth2::Client.new(
        ENV['MMF_API_KEY'],
        ENV['MMF_SECRET_KEY'], 
        :authorize_url => "https://www.mapmyfitness.com/v7.0/oauth2/authorize/", 
        :token_url => "https://oauth2-api.mapmyapi.com/v7.0/oauth2/access_token/", 
        :site => "https://oauth2-api.mapmyapi.com"
    )

  end

end
4

2 回答 2

0

您调用 AccessToken.new 的问题是“param_name”。

来自文档(http://www.rubydoc.info/github/intridea/oauth2/ebe4be038ec14b349682/OAuth2/AccessToken

:param_name (String) — 默认值:'bearer_token' — 用于在 :body 或 :query 传输模式下传输访问令牌值的参数名称

默认值为“bearer_token”,应该是,但在这里,您将其更改为“oauth2_access_token”。

于 2014-12-10T18:22:38.743 回答
0

我想到了。get_workout 需要是这样的:

  def get_workout

    auth_token = params[:auth_token]

    token = OAuth2::AccessToken.new(mmf_client, auth_token)

    # Get workout
    workout_id = params[:workout_id]
    workout_data = token.get('/v7.0/workout/' + workout_id, :params => { 'field_set' => 'time_series' }, :headers => {'Api-Key' => ENV['MMF_API_KEY'], 'Authorization' => auth_token}).body

    respond_to do |format|
      format.json{ render :json => {:mmf_workout_data => workout_data}.to_json }
    end

  end
于 2014-07-23T00:42:17.843 回答