8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

devise_token_auth + omniauthにログアウトを追加

Posted at

前回のdevise_token_authとomniauthを使ったログインを試すからの続き。
最初は古いclient_idやtokenをログイン時に再発行されたやつで上書きしていると思っていたけど、どうやら上書きしないでひたすら追加するだけっぽい。
そのためusersテーブルを確認したら使われなくなったclient_idやtokenがtokensカラムにもりもり溜まっていた。
これはさすがによろしくないのでログアウトを追加して不要になったclient_idとtokenは消すことにする。

1. ルーティングの追加

現時点でのルーティング

$ rails routes
             Prefix Verb     URI Pattern                            Controller#Action
auth_validate_token GET      /auth/validate_token(.:format)         devise_token_auth/token_validations#validate_token
       auth_failure GET      /auth/failure(.:format)                users/omniauth_callbacks#omniauth_failure
                    GET      /auth/:provider/callback(.:format)     users/omniauth_callbacks#omniauth_success
                    GET|POST /omniauth/:provider/callback(.:format) users/omniauth_callbacks#redirect_callbacks
   omniauth_failure GET|POST /omniauth/failure(.:format)            users/omniauth_callbacks#omniauth_failure
                    GET      /auth/:provider(.:format)              redirect(301)
    application_api          /                                      ApplicationAPI

本当なら/auth/sign_outが良いんだろうけど/omniauth/sign_outにリダイレクトされてしまうので/users/sign_outとして追加する。

config/routes.rb
Rails.application.routes.draw do
  mount_devise_token_auth_for 'User', at: 'auth', controllers: {
    omniauth_callbacks: "users/omniauth_callbacks"
  }
  as :user do
     delete '/users/sign_out', to: 'users/sessions#destroy', as: :destroy_user_session
  end
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
  mount ApplicationAPI, at: "/"
end

ルーティングの確認

rails routes
              Prefix Verb     URI Pattern                            Controller#Action
 auth_validate_token GET      /auth/validate_token(.:format)         devise_token_auth/token_validations#validate_token
        auth_failure GET      /auth/failure(.:format)                users/omniauth_callbacks#omniauth_failure
                     GET      /auth/:provider/callback(.:format)     users/omniauth_callbacks#omniauth_success
                     GET|POST /omniauth/:provider/callback(.:format) users/omniauth_callbacks#redirect_callbacks
    omniauth_failure GET|POST /omniauth/failure(.:format)            users/omniauth_callbacks#omniauth_failure
                     GET      /auth/:provider(.:format)              redirect(301)
destroy_user_session DELETE   /users/sign_out(.:format)              users/sessions#destroy
     application_api          /                                      ApplicationAPI

2. Sessionsコントローラの作成

ログアウト時に呼び出されるsessions_controller.rbをdevise_token_authからコピーしてapp/controllers/usersに設置して編集する。
以下は、変更箇所のみ抜粋。

app/controllers/users/sessions_controller.rb
# module DeviseTokenAuth
module Users
  class SessionsController < DeviseTokenAuth::ApplicationController 
    def render_destroy_error
      render json: {
        message: I18n.t("devise_token_auth.sessions.user_not_found")
      }, status: 404
      # render_error(404, I18n.t("devise_token_auth.sessions.user_not_found"))
    end
  end
end

あとは使わないnewやcreate系はコメントアウトしておくといいかも。

3. 動作確認

サーバを起動した後、twitterなりfacebookなりでログインして有効なclient_idとtokenとuidを入手する。

その後curlなりPostmanなどでhttp://localhost:3000/users/sign_outにアクセスする。

$ curl -X DELETE -H 'client:XXXXXXXXXXXX' -H 'uid:XXXXXXXXXXXX' -H 'access-token:XXXXXXXXXXXXXX' http://localhost:3000/users/sign_out | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0    16    0    16    0     0     10      0 --:--:--  0:00:01 --:--:--    12
{
  "success": true
}

ログアウトに成功。
もう一度実行すると情報が見つからないというエラーメッセージが返ってくる。

$ curl -X DELETE -H 'client:XXXXXXXXXXXX' -H 'uid:XXXXXXXXXXXX' -H 'access-token:XXXXXXXXXXXXXX' http://localhost:3000/users/sign_out | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0    54    0    54    0     0     55      0 --:--:-- --:--:-- --:--:--    57
{
  "message": "User was not found or was not logged in."
}

これでログアウト処理が実装できた。

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?