[英]how to authenticate the user with warden/devise without password?
[英]How do I determine which Devise/Warden strategy was used to authenticate/log in the user?
假设我对 Warden 有两个默认策略, :database_authenticatable
和:jwt
。
我如何确定(在控制器内部)登录current_user
时使用了哪种策略?
您可以使用env['warden'].winning_strategy
获取上次运行策略的标签。 这意味着该策略已运行,但其结果可能是:failure
、 :success
甚至:custom
。 您应该检查env['warden'].result == :success
以确保策略成功运行。
AFAIK 没有直接执行此操作的实现。 您可以覆盖这些策略行为以注入某种会话参数来识别哪个是哪个,或者您可以使用 JWT Headers 必要条件来识别它被用于给定请求。 如果您在默认设置中使用默认database_authenticable
,它将用于您的一般 WEB 导航,它利用浏览器会话。 您可以利用它来识别您的用户,因为通过 API cookie/会话消费时通常不存在。 看看你可以用Rails 的会话做什么,并用它来识别你用户的浏览器,它可能是这样的:
session[:user_id] = @current_user.id
User.find(session[:user_id])
那么你可以使用session[:user_id].present?
检查会话是否正在给定上下文中使用,不包括 JWT HTTP 标头行为。
您也可以反过来这样做,识别Authorization
或Authentication
HTTP 标头的存在。 除非您为当前请求设置了 JWT 或其他类型的 HTTP 身份验证,否则不会出现这种情况。 这可以按如下方式完成:
request.headers['Authorization'].present? || request.headers['Authentication'].present?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.