使用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
如果有其他更好的方法,请告诉我,我将不胜感激。