Rack-Recaptcha 项目使用教程
1. 项目的目录结构及介绍
Rack-Recaptcha 项目的目录结构如下:
rack-recaptcha/
├── Gemfile
├── Gemfile.lock
├── LICENSE
├── README.md
├── Rakefile
├── lib/
│ └── rack/
│ └── recaptcha.rb
├── rack-recaptcha.gemspec
├── test/
│ └── test_recaptcha.rb
└── travis.yml
目录结构介绍
Gemfile
和Gemfile.lock
:定义了项目的依赖关系。LICENSE
:项目的许可证文件。README.md
:项目的说明文档。Rakefile
:用于定义 Rake 任务的文件。lib/
:包含项目的主要代码文件。rack/
:Rack 中间件的代码目录。recaptcha.rb
:Rack-Recaptcha 的主要实现文件。
rack-recaptcha.gemspec
:用于打包和发布 gem 的规范文件。test/
:包含测试文件。test_recaptcha.rb
:Rack-Recaptcha 的测试文件。
travis.yml
:用于 Travis CI 的配置文件。
2. 项目的启动文件介绍
Rack-Recaptcha 项目的启动文件主要是 lib/rack/recaptcha.rb
。这个文件定义了 Rack 中间件的主要逻辑,包括初始化、配置和验证 recaptcha 的功能。
启动文件内容概览
require 'rack'
require 'net/http'
require 'json'
module Rack
class Recaptcha
def initialize(app, options = {})
@app = app
@public_key = options[:public_key]
@private_key = options[:private_key]
end
def call(env)
req = Rack::Request.new(env)
if req.post?
response = verify_recaptcha(req.params['g-recaptcha-response'])
if response['success']
env['recaptcha.valid'] = true
else
env['recaptcha.valid'] = false
end
end
@app.call(env)
end
private
def verify_recaptcha(response)
uri = URI('https://www.google.com/recaptcha/api/siteverify')
params = {
'secret' => @private_key,
'response' => response
}
uri.query = URI.encode_www_form(params)
res = Net::HTTP.get_response(uri)
JSON.parse(res.body)
end
end
end
3. 项目的配置文件介绍
Rack-Recaptcha 项目的配置文件主要是 rack-recaptcha.gemspec
和 Gemfile
。
rack-recaptcha.gemspec
这个文件定义了 gem 的元数据和依赖关系,包括名称、版本、作者、描述、依赖库等。
Gem::Specification.new do |spec|
spec.name = "rack-recaptcha"
spec.version = "0.1.0"
spec.authors = ["Arthur Chiu"]
spec.email = ["email@example.com"]
spec.summary = %q{Rack Middleware for CAPTCHA verification via Recaptcha API}
spec.description = %q{Drop this Rack middleware in your web application to enable CAPTCHA verification via Recaptcha API}
spec.homepage = "https://github.com/achiurizo/rack-recaptcha"
spec.license = "MIT"
spec.files = `git ls-files -z`.split("\x0")
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
spec.require_paths = ["lib"]
spec.add_development_dependency "bundler", "~> 1.7"