我正在尝试阅读GitHub上的一个开源项目的代码,并发现自己在查看文件时感到困惑。以下代码中的“authenticator”是什么,以及它在何处定义。据我所知,它没有被定义为任何地方的类。这是项目网址:github repository
authenticator :server do
header "X-Server-API-Key", "The API token for a server that you wish to authenticate with.", :example => 'f29a45f0d4e1744ebaee'
error 'InvalidServerAPIKey', "The API token provided in X-Server-API-Key was not valid.", :attributes => {:token => "The token that was looked up"}
error 'ServerSuspended', "The mail server has been suspended"
lookup do
if key = request.headers['X-Server-API-Key']
if credential = Credential.where(:type => 'API', :key => key).first
if credential.server.suspended?
error 'ServerSuspended'
else
credential.use
credential
end
else
error 'InvalidServerAPIKey', :token => key
end
end
end
rule :default, "AccessDenied", "Must be authenticated as a server." do
identity.is_a?(Credential)
end
end
答案 0 :(得分:2)
正如Aetherus所说,它来自宝石moonrope
。
以下是如何使用它
使用入门
首先,您需要定义验证器。验证者的角色是从API请求中提取“身份”。在此示例中,我们将使用对每个用户都是唯一的令牌来验证我们的消费者。下面的示例演示了一个非常简单的身份验证器。
authenticator :default do
header "X-Auth-Token", "The user's unique API token.", :example => 'f29a45f0-b6da-44ae-a029-d4e1744ebaee'
error 'InvalidAPIToken', "The API token provided in X-Auth-Token was not valid.", :attributes => {:token => "The token that was looked up"}
lookup do
if token = request.headers['X-Auth-Token']
if user = User.find_by_api_token(token)
user
else
error 'InvalidAPIToken', :token => token
end
end
end
rule :default, "AccessDenied", "Must be authenticated as a user." do
identity.is_a?(User)
end
rule :anonymous, "MustBeAnonymous", "Must be anonymous." do
identity.nil?
end
end
让我们打破这一点:
第一行设置验证者的名称。在大多数情况下,你只会有一个应该命名的:default。这将适用于API中的所有操作。
接下来,我们定义验证者使用X-Auth-Token标头。我们 提供描述和示例以用于文档目的。
接下来,我们定义在尝试查找请求的标识时可能会引发InvalidAPIToken错误。我们包含一个描述以及应该随错误返回的属性哈希。
接下来,我们定义一个查找块,指定如何从请求中查找您的身份对象。这与在API中的任何操作使用的范围相同。此块将返回标识对象,引发错误或不返回任何内容。如果它返回某些内容,那么它将用作标识对象,请求将继续。如果它引发错误,则错误将返回给用户,请求将停止。如果没有返回,请求将继续,但是没有身份。
接下来,我们设置一个默认访问规则,该规则在每个请求上执行,以验证身份是否可以访问所请求的操作。默认规则将应用于所有操作,但您可以创建可以为特定操作或控制器选择的其他操作。此规则的块必须返回true或false值,具体取决于标识是否满足访问条件。第二个参数是错误代码,如果该条件不满足请求,将返回该错误代码。第三个参数是实际条件的描述(用于文档)。
最后,我们定义了一个匿名规则,可用于不应提供任何身份的任何操作。
这是一个链接,提供有关用法的更多信息。 moonrope authentication
答案 1 :(得分:1)
什么是"身份验证员"在下面的代码中,以及在何处定义。
关于"什么" - :server
是使用positional argument do ... end
和block argument($ git clone https://github.com/atech/postal.git
Cloning into 'postal'...
remote: Counting objects: 1139, done.
remote: Total 1139 (delta 0), reused 0 (delta 0), pack-reused 1139
Receiving objects: 100% (1139/1139), 2.09 MiB | 1.22 MiB/s, done.
Resolving deltas: 100% (502/502), done.
部分)调用的方法。
"其中"由于Ruby的动态特性,我很难回答。
如果没有IDE可以找到该方法的来源,我会做什么:
$ cd postal
$ bundle install
Fetching gem metadata from https://rubygems.org/............
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Fetching https://github.com/unixcharles/acme-client
Fetching https://github.com/adamcooke/moonrope
Installing rake 11.3.0
Installing multipart-post 2.0.0
Installing concurrent-ruby 1.0.5
...
$ bundle console
irb(main):001:0>
bundle console
irb(main):001:0> method(:authenticator)
NameError: undefined method `authenticator'
...
也许它是一个全球性的功能:
irb(main):002:0> ObjectSpace.each_object(Module).select { |m| m.instance_methods.include?(:authenticator) }
#=> [Moonrope::Action, Moonrope::DSL::BaseDSL, Moonrope::DSL::ControllerDSL, Moonrope::DSL::ActionDSL, Moonrope::Controller]
不。但它可能是在某个模块下定义的,让我们找到它:
Moonrope
irb(main):003:0> Moonrope::DSL::BaseDSL.instance_method(:authenticator).source_location
#=> ["/Users/sos/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/bundler/gems/moonrope-f56a37b8f121/lib/moonrope/dsl/base_dsl.rb", 73]
...从未听说过。请详细说明:
irb(main):004:0> ^Z
zsh: suspended bundle console
$ vi +73 $(bundle show moonrope)/lib/moonrope/dsl/base_dsl.rb
它是一颗宝石,让我们打开它:
sphere
看起来不错: