2018年10月14日日曜日

Patreon の OAuth 認証を使ってみた

概要

Patreon には OAuth の仕組みがありこれを使えば Patreon のサーバ情報に API を使ってアクセスすることができます
今回は OAuth を実現するためのログイン画面の使い方から OAuth 後の API の呼び出しまで基本的な流れを試してみました

環境

  • macOS 10.14
  • Ruby 2.5.1p57
  • patreon-ruby 0.5.0

クライアントアプリ作成

まずは OAuth 用のクライアントアプリを作成しましょう
このページから作成できます
コールバック用の URL は localhost で動作させるアプリを指定します

patreon_oauth3.png

クライアントを作成すると「Client ID」と「Client Secret」が取得できるのでメモしておきましょう

ライブラリインストール

  • bundle init
  • vim Gemfile
gem "sinatra"
gem "patreon"
  • bundle install --path vendor

アプリ作成

今回のアプリの流れとしては

  • Patreon でログインページへ遷移
  • ログインできた場合はコールバック用のページでトークンを取得
  • 取得したトークンを使って Patreon の情報を取得

になります

ログイン画面の作成

まずは Patreon のログイン画面に遷移させるページを作成します

  • vim app.rb
require 'sinatra/base'

class TestOAuth < Sinatra::Base
  get '/login' do
    erb :login
  end
end

/login にアクセスした場合にログイン画面に遷移するリンクを表示します

  • mkdir views
  • vim views/login.erb
<html>
<head>
</head>
<body>
  <a href="https://www.patreon.com/oauth2/authorize?response_type=code&client_id=0xmmvlIcKC0PAhdZHdQ31myNO1qPD4MDQBqHOLoZQ19n5DCmfupfyZdlhwv8ikMe&redirect_uri=http://localhost:9292/callback">login</a>
</body>
</html>

Patreon のログイン画面へのリンクにはフォーマットが決められており https://www.patreon.com/oauth2/authorize に対して response_typeclient_idredirect_url をパラメータに付与してリクエストします
ここで client_id は先程クライアント作成時にメモしておいた「Client ID」を記載してください
また redirect_url もクライアントアプリを作成するときに指定した URL を指定してください
間違っている場合ログイン画面が表示されません

コールバック用のページの作成

ログインに成功した場合に呼び出されるコールバック用のページを作成します
app.rb にコールバック用のリクエストを受け付けるルーティング /callback を追加します

  • vim app.rb
require 'sinatra/base'
require 'patreon'

class TestOAuth < Sinatra::Base
  get '/login' do
    erb :login
  end

  get '/callback' do
    client_id = '0xmmvlIcKC0PAhdZHdQ31myNO1qPD4MDQBqHOLoZQ19n5DCmfupfyZdlhwv8ikMe'
    client_secret = 'Xex5ENhpLeZwv7UdZWBF2HS6bLqwE6cUYQJVkQWevcBMBc2bINhKKeh-l069Uypq'
    redirect_url = 'http://localhost:9292/callback'

    oauth_client = Patreon::OAuth.new(client_id, client_secret)
    tokens = oauth_client.get_tokens(params['code'], redirect_url)

    api_client = Patreon::API.new(tokens['access_token'])
    user = api_client.fetch_user()
    @user_data = user.data
    erb :callback
  end
end

client_id, client_secret は作成したクライアントのものを指定してください
その 2 つからトークンを取得するための oauth_client を作成します
コールバックされたページには code というパラメータが付与されて呼び出されます
その code と redirect_url そして oauth_client を使って get_tokens メソッドを呼び出すことでトークン情報を取得することができます

トークンにはいくつか種類がありますが API をコールするために必要なのは access_token になります
ハッシュとして受け取れるので access_token にアクセスしましょう

あとはトークンを元に Patreon::API で API をコールするためのクライアントを作成し fetch_user などのメソッドをコールすれば OK です

今回は取得したデータをテンプレートに渡してそちらでアイコンと名前を表示します

  • vim views/callback.erb
<html>
<head>
</head>
<body>
  <h1><%= @user_data.full_name %></h1>
  <img src="<%= @user_data.thumb_url %>">
</body>
</html>

動作確認

  • bundle exec rackup config.ru

でアプリを起動しましょう
あとは localhost:9292/login にアクセスするとログインへのリンクが表示されるのでそれを踏み Patreon のログイン画面でログインすればユーザ情報が表示されるはずです

patreon_oauth_demo.gif

最後に

Patreon の OAuth 機能を使ってログインから情報を取得するまでの基本的な流れを紹介しました
OAuth 自体に特に難しかった点はなかったのですが、Ruby のクライアントライブラリの使い方などは知っておく必要がありそうです
公式に Sinatra の OAuth のサンプルもあったのでそれも参考にすると良いかもしれません

今回使用したクライアントアプリはすでに削除しているので client_idclient_secret は使えませんのでご注意ください

参考サイト

0 件のコメント:

コメントを投稿