gpt4 book ai didi

ruby-on-rails - 使用 Rails 4 中的设备登录 API 生成 token

转载 作者:行者123 更新时间:2023-12-02 21:17:19 26 4
gpt4 key购买 nike

我正在通过 Rails 实现 api。

我想实现以下功能但不知道如何实现?

我尝试了这个示例应用

我有包含电子邮件、密码和 access_token 的用户模型

class UsersController < ApplicationController

def signin


c_user = User.find_by_email(params[:email])
pass = params[:password]
if c_user.password == pass

render json: c_user.access_token
end

end


private
def users_params
params.require(:user).permit(:email, :password)
end

end

如果用户通过api请求http://localhost:3000/[email protected]&password=password

然后它将检查电子邮件和密码并返回用户可以用于将来请求的access_token。

我想用 devise 或任何其他 gem 实现相同的功能,请帮助我理解它。提前致谢

最佳答案

这就是我在我的应用程序中实现这种机制的方式:

  • 每当创建用户时都会生成 access_token。
  • 每当用户登录时都使用该 access_token 进行响应。
  • 需要对每个所需请求进行 access_token 身份验证。

用户.rb

class User < ActiveRecord::Base
# Use this before callback to set up User access_token.
before_save :ensure_authentication_token

# If the user has no access_token, generate one.
def ensure_authentication_token
if access_token.blank?
self.access_token = generate_access_token
end
end

private

def generate_access_token
loop do
token = Devise.friendly_token
break token unless User.where(access_token: token).first
end
end
end

application_controller.rb

class ApplicationController < ActionController::Base

private

# To make authentication mechanism more safe,
# require an access_token and a user_email.
def authenticate_user_from_token!
user_email = params[:user_email].presence
user = user_email && User.find_by_email(user_email)

# Use Devise.secure_compare to compare the access_token
# in the database with the access_token given in the params.
if user && Devise.secure_compare(user.access_token, params[:access_token])

# Passing store false, will not store the user in the session,
# so an access_token is needed for every request.
# If you want the access_token to work as a sign in token,
# you can simply remove store: false.
sign_in user, store: false
end
end
end

然后您可以在您想要通过 access_token 身份验证保护的任何 Controller 中使用此 before_filter:

before_filter :authenticate_user_from_token!

您还需要覆盖 Devise session Controller ,以便它使用包含 access_token 的 JSON 进行响应。

用户/sessions_controller.rb

class Users::SessionsController < Devise::SessionsController

# Disable CSRF protection
skip_before_action :verify_authenticity_token

# Be sure to enable JSON.
respond_to :html, :json

# POST /resource/sign_in
def create
self.resource = warden.authenticate!(auth_options)
set_flash_message(:notice, :signed_in) if is_flashing_format?
sign_in(resource_name, resource)
yield resource if block_given?

respond_with resource, location: after_sign_in_path_for(resource) do |format|
format.json { render json: {user_email: resource.email, access_token: resource.access_token} }
end
end

end

并确保在您的 route 指定它:

路线.rb

devise_for :users, controllers: { sessions: 'users/sessions' }

关于ruby-on-rails - 使用 Rails 4 中的设备登录 API 生成 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29853474/

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