使用Ruby的GraphQL来实施认证

首先

最近,我正在学习graphql-ruby。我尝试实现了身份验证功能,这是我的备忘录。但是,目前我还在试探中,不确定这种方法是否正确。

想做的事情

有些突变或查询只能由登录用户发出,但希望可以发出与用户无关的查询,即使未登录。但是在所有查询中添加代码来检查是否登录太麻烦了。

首先是常规认证。

在graphql_controller.rb文件中的execute方法内进行用户认证,并将current_user保存在context中。

def excute
  current_user = User.auth_user(params)
  context: { current_user: current_user }
# その後の処理↓
...
end

在上述例子中,我们通过”auth_user”方法进行认证,然后获取到一个user对象。
将其传递给context后,可以在解析器内等地通过context[:current_user]来获取。

一个创意加以改进

嗯,對於這個情況,我們需要在resolver內每次都確認context[:current_user]是否存在。但是,如果在excute內部拒絕這種情況,那麼所有的查詢都將無法發出。因此,我決定在base_query.rb中寫入以下處理方式。

  class BaseQuery < GraphQL::Schema::Resolver
    def current_user
      context[:current_user].presence || raise(GraphQL::ExecutionError, 'Permissions deny, Please login again')
    end
  end

这个查询继承了base_query.rb,所以当使用current_user时,只需调用此方法即可。

如果要更加仔細地做的話

这次判断是根据与用户的关联性来进行的,但如果要进行更详细的设置,似乎可以根据返回的Object类型进行指定。我打算尝试一下,并写一篇文章。
https://graphql-ruby.org/authorization/authorization.html
如果有其他更好的方法,请告诉我,我将不胜感激。

广告
将在 10 秒后关闭
bannerAds