2014-07-22 4 views
0

Ruby on Rails 3.2 및 oauth2 gem에서 MapMyFitness API (www.mapmyapi.com)를 사용하려고합니다. 첫째, 내 응용 프로그램은 "get_auth_url"에 auth_url을 생성합니다. 그러면 브라우저가이 브라우저로 이동하고 인증되면 "mapmyfitness_callback"으로 콜백이 반환됩니다. "mapmyfitness_callback"은 "운동"목록을 가져오고 그 목록은 브라우저에 표시됩니다.MapMyFitness API Oauth2 오류

문제는 사용자가 다운로드 할 운동을 선택할 때입니다. 선택한 운동을 검색하기 위해 "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를 :: 오류 (: { "oauth1_error": "잘못된 인증 헤더", "oauth1_error_code": "OAUTH1 : UNKNOWN"}) : 응용 프로그램 `get_workout '

전체 컨트롤러 코드 /controllers/telemetry_controller.rb:60:in :

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 

답변

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 
+0

이전 코드가 작동하지 않는 이유에 대한 자세한 설명을 제공해 주시겠습니까? –

0

AccessToken.new를 호출 할 때 발생하는 문제는 "param_name"입니다. 워드 프로세서 (http://www.rubydoc.info/github/intridea/oauth2/ebe4be038ec14b349682/OAuth2/AccessToken)에서

: PARAM_NAME (문자열) - 기본 : 'bearer_token'- 매개 변수 이름은 액세스 토큰 값의 전송을 위해 사용하기 : 신체 나 : 쿼리 전송 모드

기본 값은 "bearer_token"입니다. 그러나 여기서는 "oauth2_access_token"으로 변경했습니다.