gpt4 book ai didi

ruby-on-rails - Rails JSON API 的简单 token 身份验证注销

转载 作者:行者123 更新时间:2023-12-04 05:30:48 27 4
gpt4 key购买 nike

我有一个 Rails 应用程序(主要是一个 JSON API)我正在使用 Devise使用来自任何来源(网络、移动)的 JSON 请求进行身份验证我正在使用 Simple Token Authentication使用 HTTP header 对用户进行身份验证。

我不确定实现应该是什么样子,但我已经起草了一个几乎可以工作的实现。

只有一个问题。那就是当用户尝试注销时……通常它应该使用户的身份验证 token 无效……但事实并非如此,我不确定问题到底出在哪里……无论是设计还是Simple Token Auth...所以非常感谢任何帮助。

但是这是代码

  # router
devise_for :users, controllers: { sessions: 'sessions',
registrations: 'registrations' }
api vendor_string: 'app', default_version: 1, path: '', format: 'json' do
version 1 do
cache as: 'v1' do
resource :some_resource
end
end

session Controller 是这样的

class SessionsController < Devise::SessionsController  
respond_to :json
skip_filter :verify_signed_out_user, only: :destroy

def create
self.resource = warden.authenticate!(scope: resource_name)
render :create, status: :created
end

def destroy
current_user.authentication_token = nil
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ take note of this line
current_user.save!
super
end
end

前面提到的行似乎有问题......当用户提供错误的 token header 时,它仍然有效并且当前用户指的是首先不应该进行身份验证的用户......例如这里是 2 个来电,规范

describe 'DELETE sessions#destroy' do
let(:user) { Fabricate(:confirmed_user) }
let(:auth_token) { user.authentication_token }
describe 'with request headers' do
context 'valid credentials' do
it 'Returns 204' do
delete '/users/sign_out', {}, {
HTTP_CONTENT_TYPE: 'application/json',
HTTP_ACCEPT: "application/vnd.app+json; version=1",
"X-User-Email" => user.email,
"X-User-Token" => user.authentication_token
}

user.reload
expect(response.status).to eq 204
expect(user.authentication_token).not_to eq auth_token
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this is ok cause it's the valid user
end
end

context 'invalid credentials' do
it 'Returns 204' do
delete '/users/sign_out', {}, {
HTTP_CONTENT_TYPE: 'application/json',
HTTP_ACCEPT: "application/vnd.app+json; version=1",
"X-User-Email" => user.email,
"X-User-Token" => 'Invalid'
}

user.reload
expect(response.status).to eq 204
expect(user.authentication_token).to eq auth_token
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this FAILS
# why did the user get new auth token when didn't sign out ????
end
end
end

这也在 Github 上有报道

为了完整起见,这里是应用程序 Controller

class ApplicationController < ActionController::Base
# The API responds only to JSON
respond_to :json

# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
# default to protect_from_forgery with: :exception
protect_from_forgery with: :null_session

# Token Authenticatable for API
acts_as_token_authentication_handler_for User
end

最佳答案

来自 simple_authentication_token page在 github 上,如果 current_user.authentication_token 在每次保存 current_user 时为空(nil),则会自动生成。

Assuming user is an instance of User, which is token authenticatable: each time user will be saved, and user.authentication_token.blank? it receives a new and unique authentication token (via Devise.friendly_token).

更新

在您的 sessions_controller.rb 中添加 acts_as_token_authentication_handler_for User

关于ruby-on-rails - Rails JSON API 的简单 token 身份验证注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27804349/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com