34063


Python-FitbitというFitbit
APIをPythonから利用するモジュールで、Heroku上のプログラムからOAuth2認証をして、アクセストークン・リフレッシュトークンを取得したい。

Python-Fitbit  
<https://github.com/orcasgit/python-fitbit>

手順はこのサイトを参考にしました。  
<http://blog.mr-but-dr.xyz/programming/fitbit-python-heartrate-howto/>

ローカルでhttp://127.0.0.1:8080をコールバックURLに指定しプログラムを実行すると、ブラウザが開き認証に成功するのですが、Heroku上でhttps://appname.herokuapp.com:443/をコールバックURLに指定し実行すると、認証に失敗します。

Herokuにおけるhttp://127.0.0.1:8080が何にあたるのかを教えてください。  
ポート番号を8080や5000に変えてみましたが、同じエラーが発生しました。

gather_keys_oauth2.py

[code]

    import cherrypy
    cherrypy.config.update({'server.socket_host':'appname.herokuapp.com','server.socket_port':443})
    
    def __init__(self, client_id, client_secret,
                 redirect_uri='https://appname.herokuapp.com:443'):
    
[/code]

エラーメッセージ

[code]

        raise socket.error(msg)
    OSError: No socket could be created -- (('IPアドレス', 443): [Errno 49] Can't assign requested address)
    
[/code]

エラーメッセージ2

[code]

    [17/Apr/2017:14:01:15] ENGINE Error in 'start' listener <bound method Server.start of <cherrypy._cpserver.Server object at 0x7f33e57b12e8>>
    Traceback (most recent call last):
      File "/app/.heroku/python/lib/python3.6/site-packages/cherrypy/process/wspbus.py", line 215, in publish
        output.append(listener(*args, **kwargs))
      File "/app/.heroku/python/lib/python3.6/site-packages/cherrypy/_cpserver.py", line 168, in start
        super(Server, self).start()
      File "/app/.heroku/python/lib/python3.6/site-packages/cherrypy/process/servers.py", line 177, in start
        portend.free(*self.bind_addr, timeout=Timeouts.free)
      File "/app/.heroku/python/lib/python3.6/site-packages/portend.py", line 143, in free
        raise Timeout("Port {port} not free on {host}.".format(**locals()))
    portend.Timeout: Port 443 not free on appname.herokuapp.com.
    
    [17/Apr/2017:14:01:15] ENGINE Shutting down due to error in start listener:
    Traceback (most recent call last):
      File "/app/.heroku/python/lib/python3.6/site-packages/cherrypy/process/wspbus.py", line 253, in start
        self.publish('start')
      File "/app/.heroku/python/lib/python3.6/site-packages/cherrypy/process/wspbus.py", line 233, in publish
        raise exc
    cherrypy.process.wspbus.ChannelFailures: Timeout('Port 443 not free on appname.herokuapp.com.',)
    
[/code]


CC BY-SA 3.0
2017-04-17T04:44:58.933
34060
2017-04-17T07:45:45.603
2017-04-17T07:45:45.603
18443
18443
question
python heroku
Herokuにおけるhttp://127.0.0.1:8080とは？


リダイレクト先はOAuthのプロバイダにあらかじめ登録したCallback URLです。

> 手順はこのサイトを参考にしました。

そのサイトは、アプリをローカル環境で動かすことを前提にしているようです。  
このため、以下のようにかかれています。

> ・Callback URL => <http://127.0.0.1:8080/> ※ここも重要です

dev.fitbit.com に上記のように登録すると、OAuth認証後のリダイレクト先は当然 127.0.0.1:8080 になります。  
herokuで動作刺せているのであれば、herokuのURL&portをdev.fitbit.comに登録する必要があると思います。


CC BY-SA 3.0
2017-04-17T05:31:05.307
34062
2017-04-17T05:31:05.307
806
34060
answer


「認証に失敗します」との事ですが、そもそもサーバの起動に失敗している気がします。

Heroku では使用するポート番号を[環境変数 `$PORT`
から取得します](https://devcenter.heroku.com/articles/dynos#web-dynos)。  
どうも デフォルトが`5000`のようで、`int(os.environ.get('PORT', '5000'))`
のようにしてポートを決定するのが定石のようですね。

Listen するインターフェースをとりあえず、`0.0.0.0`（全て）にするなら、設定は下記のようになるかと思います。

[code]

    cherrypy.config.update({
        'server.socket_host': '0.0.0.0',
        'server.socket_port': int(os.environ.get('PORT', '5000')),
    })
    
[/code]

まずはサーバの起動を成功させましょう。


CC BY-SA 3.0
2017-04-17T05:50:19.297
34063
2017-04-17T05:50:19.297
3054
34060
answer