我有一个我正在尝试与一个android 应用程序同步的rails 应用程序。我已经成功设置了使用Doorkeeper作为服务器和Oltu作为客户端的身份验证。
我的应用程序跟踪作为每个用户列表存在的习惯。我在习惯控制器中的索引方法是:
def index
@habits = current_user.habits
end
通过 Devise 进行身份验证时,此方法有效,使用 Doorkeeper 时current_user
为nil
.
我有一个我正在尝试与一个android 应用程序同步的rails 应用程序。我已经成功设置了使用Doorkeeper作为服务器和Oltu作为客户端的身份验证。
我的应用程序跟踪作为每个用户列表存在的习惯。我在习惯控制器中的索引方法是:
def index
@habits = current_user.habits
end
通过 Devise 进行身份验证时,此方法有效,使用 Doorkeeper 时current_user
为nil
.
从Doorkeeper 的自述文件中......
如果要根据当前资源所有者(即访问令牌所有者)返回数据,则可能需要在控制器中定义一个返回资源所有者实例的方法:
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
访问令牌所有者的凭据 ()。
我会在您的基本 API 控制器中覆盖 current_user,例如:
private
def current_user
@current_user ||= User.find(doorkeeper_token[:resource_owner_id])
end
我有一个 API 需要允许通过 Doorkeeper 或设计进行身份验证。以下解决方案允许主应用程序使用 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
我不知道这是否是正确的方法,但解决方案是:
def index
user = current_user
user ||= User.find(doorkeeper_token[:resource_owner_id]) if doorkeeper_token
@habits = user.habits
end
您不能分配给,current_user
否则它会将其设置为nil
.