我正在尝试与rails app同步android app。我已使用authentication作为服务器并Doorkeeper作为客户端成功设置了Oltu。
我的应用程序跟踪按用户列表存在的习惯。习惯控制器中的索引方法是:
def index
@habits = current_user.habits
end
通过Devise进行身份验证时,当使用门卫current_user
为nil
时,此方法有效。
答案 0 :(得分:8)
我会覆盖基本API控制器中的current_user,例如:
private
def current_user
@current_user ||= User.find(doorkeeper_token[:resource_owner_id])
end
答案 1 :(得分:7)
来自Doorkeeper's README ...
如果要基于当前资源所有者返回数据,则在其他情况下 单词,访问令牌所有者,您可能想要在您的中定义一个方法 返回资源所有者实例的控制器:
class Api::V1::CredentialsController < Api::V1::ApiController
before_action :doorkeeper_authorize!
respond_to :json
# GET /me.json
def me
respond_with current_resource_owner
end
private
# Find the user that owns the access token
def current_resource_owner
User.find(doorkeeper_token.resource_owner_id) if doorkeeper_token
end
end
在此示例中,我们将返回访问权限的凭据(me.json
)
令牌所有者。
答案 2 :(得分:3)
我有一个API,需要通过门卫或设计进行身份验证。以下解决方案允许主应用程序使用Oauth客户端将使用的相同端点并共享current_user方法。
before_action :doorkeeper_authorize!, unless: :user_signed_in?
def current_user
@current_user ||= if doorkeeper_token
User.find(doorkeeper_token.resource_owner_id)
else
warden.authenticate(scope: :user)
end
end
答案 3 :(得分:0)
我不知道这是否是正确的方法,但解决方法是:
def index
user = current_user
user ||= User.find(doorkeeper_token[:resource_owner_id]) if doorkeeper_token
@habits = user.habits
end
您无法分配到current_user
,也不会将其设置为nil
。