EveOnline Authenticated Crestを使ってThirdPartyアプリを作ってみる その2


前回は Eve Onlineのサイト上で自分のアプリを登録し、key取得まで行った。

今回は取得したKeyを使用して認証、そして何かしらのキャラクター情報取得まで行っていく。

結論としてなんとかキャラ情報取得までいけたが、Rails 初心者、OAuthなにそれおいしいの状態だったのでキャラ情報取得までにとても苦労した。。。

 

なにはともあれ、まず始めにEve Online 公式ページにかかれてる情報をみてみる。

https://developers.eveonline.com/resource/single-sign-on 

 

最初に、OAuth 2.0 Authorization Framework を使うということがかかれている。
(最初ここ読み飛ばしてOAuth 1.0だと思い込んでいたためのちのち苦労させられた。。。)

OAuth 2.0 については他サイトで情報がたくさんあるため、そちらを参照。
ちなみに次のサイトが処理フローがわかりやすかったので貼っときます。

OAuth 2.0でWebサービスの利用方法はどう変わるか

REGISTERING FOR THE SSO の部分は前回やったので飛ばす。

IMPLEMENTING THE SSO Redirect to the SSO の部分で、いろいろパラメータつけてRedirectしろよと書いてあるので、手動でURLたたいてみるとそれっぽい認証ページにいけることを確認した。

ここで、OAuth2.0 使う上で先人がすでに Rails gem 作っているはずなので gem探しはじめる。すぐに見つかった。
omniauth-oauth2

使い方を調べていくと、どうもTwitterとかFacebookとか これをベースに拡張したGemを使うということがわかった。

まあEve Onlineのもあるんじゃないかと期待を寄せて探してみたが、見つからず。。。自分でgemを作るはめに。。。

暫定版 として下記のような感じになった。

omniauth-eveonline.gemspec

# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'omniauth/eveonline/version'

Gem::Specification.new do |spec|
  spec.name          = "omniauth-eveonline"
  spec.version       = Omniauth::Eveonline::VERSION
  spec.authors       = ["todo"]
  spec.email         = ["todo@me.com"]
  spec.summary       = 'Eve Online Oauth'
  spec.description   = 'Eve Online Oauth'
  spec.homepage      = ""
  spec.license       = "MIT"

  spec.files         = `git ls-files -z`.split("\x0")
  spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
  spec.test_files    = spec.files.grep(%r{^(test|spec|features)/})
  spec.require_paths = ["lib"]

  spec.add_development_dependency "bundler", "~> 1.7"
  spec.add_development_dependency "rake", "~> 10.0"
end

omniauth-eveonline/lib/omniauth-eveonline.rb

require 'omniauth/eveonline/version'
require 'omniauth/strategies/eveonline'

omniauth-eveonline/lib/strategies/eveonline.rb


require 'omniauth-oauth2'
require 'multi_json'
require 'logger'

module OmniAuth
  module Strategies
    class EveOnline < OmniAuth::Strategies::OAuth2
      option :name, 'eve_online'

      option :client_options, {:site => "https://login.eveonline.com",
                               :authorize_url => '/oauth/authorize',
                               :token_url => '/oauth/token'}

      uid { request.params['user_id'] }

      info do
        {
            #:name => raw_info['access_token'],
            #:location => raw_info['expires_in']
        }
      end

      extra do
        {
            #'raw_info' => raw_info
        }
      end

      def request_phase
        log = Logger.new(STDOUT)
        log.debug "----request phase start---"
        super
      end

      def callback_phase
        log = Logger.new(STDOUT)
        log.debug "----request ---"
        log.debug request.url
        super
      end

      def raw_info
      end

    end
  end
end

ここまで来たので今度はクライアント側を実装する

client側のgemに次のものを追加する

gem "omniauth-eveonline"
gem "omniauth-oauth2"

適当に初期ページつくって次のリンクをはる

<li><%= link_to "Sign in", "/auth/eve_online"  %></li>

callbackしてきたときの処理のためにコントローラ作っておく。

 rails g controller sessions

routesに次のコードを追加

  #omniauth
  get "/auth/:provider/callback" => "sessions#create"

SessionControllerを下記コードのように修正

class SessionsController < ApplicationController
  def create
    auth = request.env["omniauth.auth"]
    logger.debug "--- auth ---"
    logger.debug auth
    logger.debug response

    redirect_to "/home/index", :notice => "Signed in!"
  end
end

config/initializers/omniauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :eve_online, '取得したClient ID', '取得した Secret Key'
end

ここまで書いたら いったん認証ができるか確認。
Sign in リンクおしたら、次のページがでた。
スクリーンショット 2014-12-23 15.28.10

その後、承認押して Signed in ! とちゃんとでたので、承認完了。ちなみにAccess Tokenがとれていたかはログで確認。
スクリーンショット 2014-12-23 22.11.21

ログ

Processing by SessionsController#create as HTML
  Parameters: {"code"=>"w8LDri5NIT6SlFSRwDO1HFBGQDXpY6L2zzwsHkCWjO9g5juR3q2j-tP3phOmh5j70", "state"=>"3fff6fa84d46baeb72ac4f2432066096d91de6fdceac0a78", "provider"=>"eve_online"}
--- auth ---
#<OmniAuth::AuthHash credentials=#<OmniAuth::AuthHash expires=true expires_at=1419333606 token="ZxiT7XVGRDWWAR-7rdlDp7fMl74AN3tuOAdDW_9Pu3XVhQk7kS69S7JHttBpAVvbjKkcQxNSRouMWVh7qORPdg2"> extra=#<OmniAuth::AuthHash raw_info=true> info=#<OmniAuth::AuthHash::InfoHash> provider="eve_online" uid=nil>

認証はできたので、次に Obtain the character ID のところをやってみる。

こちらも王道がわからんかったのでとりあえず暫定でSessionController書き換えてやってみる。

class SessionsController < ApplicationController
  def create
    auth = request.env["omniauth.auth"]
    logger.debug "--- auth ---"
    logger.debug auth
    logger.debug response

    logger.debug "---start"

    #GET access token
    token = request.env["omniauth.auth"]["credentials"]["token"]
    logger.debug token

    #create access token
    client = OAuth2::Client.new("取得したClient ID","取得した Secret Key", :token_url => '/oauth/token',:site => "https://login.eveonline.com")

    access_token = OAuth2::AccessToken.new(client,token)
    @info = access_token.get("https://login.eveonline.com/oauth/verify").parsed
    logger.debug @info

    redirect_to "/home/index", :notice => "Signed in!"
  end
end

デバッグで確認する

スクリーンショット 2014-12-23 22.24.01

 

ちゃんととれました!!やったね!

コメントはまだありません

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

AWS
Docker
ECS+ALBの動的ポートマッピングでダウンタイムのないデプロイを試してみた

はじめに 少し前に個人で作成しているWebサービスのインフラにDockerを使い始めました。 複数台 …

スクリーンショット 2016-08-16 0.43.10
AngularJS
クライアントAngularJS サーバーサイドRails5 におけるOmniauth 認証を試してみる

去年にEOPESを公開してから1年半。 初めての外部公開サービスだったが、ソースは結構ごり押し部分も …

スクリーンショット 2016-01-09 20.02.08
Ruby on Rails
Capistrano3を利用してBitbucketプライベートリポジトリにあるRailsアプリをデプロイしてみた

Railsアプリを配置する際、毎回手作業で頑張って配置してきたが、そろそろ自動デプロイを・・・ とい …