代码之家  ›  专栏  ›  技术社区  ›  Sourabh Banka

如何在Rails API中使用design jwt和design for signin、signup和signout

  •  4
  • Sourabh Banka  · 技术社区  · 8 年前

    我正在使用Rails作为后端 devise-jwt 对前端部分做出反应。

    我在跟踪这个 https://github.com/waiting-for-dev/devise-jwt/blob/master/README.md

    my routes.rb文件包含:

     Rails.application.routes.draw do
      # remove this in production
      require 'sidekiq/web'
      mount Sidekiq::Web => '/sidekiq'
    
      namespace :api, defaults: { format: 'json' } do
        namespace :v1 do
          devise_for :users, :controllers => {sessions: 'api/v1/sessions', registrations: 'api/v1/registrations'}
        end
      end
    end
    

    我的注册_controller.rb(app/controllers/api/registrations _controller.rb)

    class Api::V1::RegistrationsController < Devise::RegistrationsController
      respond_to :json, :controllers => {sessions: 'sessions', registrations: 'registrations'}
    
      before_action :sign_up_params, if: :devise_controller?, on: [:create]
    
      def create
        build_resource(sign_up_params)
    
        if resource.save
          render :json => resource, serializer: Api::V1::UserSerializer, meta: { message: 'Sign up success', token: request.headers["Authorization"] }, :status => :created
        else
          render :json => resource, adapter: :json_api, serializer: ActiveModel::Serializer::ErrorSerializer, meta: { message: 'Sign up success' }, :status => :created
        end
      end
    
    
      protected
    
      def sign_up_params
        params.require(:sign_up).permit(:first_name, :last_name, :mobile, :email, :password, :password_confirmation)
      end
    end
    

    my sessions_controller.rb(app/controllers/api/sessions_controller.rb)

    class Api::SessionsController < Devise::SessionsController  
      respond_to :json
    end
    

    我的应用程序_controller.rb(app/controllers/application_controller.rb)

    class ApplicationController < ActionController::Base
    end
    

    基本上,下一步要做什么才能获得代币。我很困惑。我将如何获得aces令牌并使用它在前端react部分进行身份验证。

    1 回复  |  直到 8 年前
        1
  •  3
  •   Taysky    8 年前

    假设您有服务器端设置,那么响应将包括 Authorization Header .

    在前端,您将发出登录请求并进行回调以捕获响应:

     window.fetch(LOGIN_URL, dataWithLoginInfo).then(response => {
        const jwt = response.headers.get('Authorization').split('Bearer ')[1];
        window.sessionStorage.setItem('jwt', jwt);
      }).catch(handleError)
    

    接下来用 Authorization 包含标题:

    const token =  window.sessionStorage.getItem('jwt')
    const headers = { Authorization: `Bearer ${token}` }
    

    或者在解码后在应用程序中使用它:

    import jwt from 'jsonwebtoken';
    const decodedToken = jwt.decode(window.sessionStorage.getItem('jwt'));
    
    if (decodedToken.isAdmin) {
      return <AdminPage />;
    } else {
      return <NotAdminPage />;
    }
    

    你会用类似的东西 https://www.npmjs.com/package/jwt-decode https://www.npmjs.com/package/jsonwebtoken 解码令牌并从中读取信息,如ID、角色、权限等。

    你真的需要遵循一个教程,比如: https://auth0.com/blog/secure-your-react-and-redux-app-with-jwt-authentication/ http://jasonwatmore.com/post/2017/12/07/react-redux-jwt-authentication-tutorial-example . 然后让一些本地专家查看您的所有代码。