@kyanny's blog

My thoughts, my life. Views/opinions are my own.

omniauth-fitbit-oauth2 で OAuth 2 認証して Fitbit API を叩く

https://github.com/kyanny/playground/tree/gh-pages/fitbit_my_first_app

ハマったところ、注意点

  • https://dev.fitbit.com/apps からアプリケーションを登録するときアプリ名に fitbit という単語を含めることはできない
  • 心拍数を API から取得するためには OAuth 2.0 Application Type を Personal にすること
  • OAuth 2 認証の方法は Authorization Code Grant Flow を選ぶこと(response_typecode にする必要がある)
  • Implicit Grant Flow は OAuth 2.0 Application Type が Client でないとダメ。 Personal を選んだアプリだと認証に失敗する
    • ↓みたいなエラーが出る。 Implicit Grant Flow を使おうとして response_typetoken を指定しているが、 OAuth 2.0 Application Type が Personal なので Implicit Grant Flow は利用できず、 Authorization Code Grant Flow とみなして処理するため必須パラメータが無い、というエラー
OAuth2::Error (:
{"errors":[{"errorType":"invalid_request","message":"Missing parameters: code Visit https://dev.fitbit.com/docs/oauth2 for more information
on the Fitbit Web API authorization process."}],"success":false}):

変更したのは実質この 3 ファイルくらい。

config/initializers/omniauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :fitbit_oauth2, ENV['FITBIT_CONSUMER_KEY'], ENV['FITBIT_CONSUMER_SECRET'], response_type: 'code', scope: 'activity heartrate location nutrition profile settings sleep social weight'
end

config/routes.rb

Rails.application.routes.draw do
  get   '/login', :to => 'sessions#new', :as => :login
  get '/auth/:provider/callback', :to => 'sessions#create'
  get '/auth/failure', :to => 'sessions#failure'
end

app/controllers/sessions_controller.rb

class SessionsController < ApplicationController
  def new
  end

  def create
    auth_hash = request.env['omniauth.auth']
    access_token = auth_hash.credentials.token
    res = RestClient.get 'https://api.fitbit.com/1/user/-/activities/heart/date/2016-05-04/1d/1sec.json', {'Authorization' => "Bearer #{access_token}"}
    require 'pp'
    pp JSON.parse(res)
    render :text => auth_hash.inspect
  end

  def failure
  end
end