2018-09-22 19:08:28 +02:00
|
|
|
require "uuid"
|
|
|
|
|
|
|
|
require "kemal"
|
|
|
|
require "jwt"
|
|
|
|
|
|
|
|
require "pg"
|
|
|
|
require "crecto"
|
|
|
|
|
|
|
|
authd_db_name = "authd"
|
|
|
|
authd_db_hostname = "localhost"
|
|
|
|
authd_db_user = "user"
|
2018-09-22 19:46:48 +02:00
|
|
|
authd_db_password = "nico-nico-nii"
|
|
|
|
authd_jwt_key = "nico-nico-nii"
|
2018-09-22 19:08:28 +02:00
|
|
|
|
|
|
|
Kemal.config.extra_options do |parser|
|
2018-09-22 19:46:48 +02:00
|
|
|
parser.on "-d name", "--database-name name", "Database name." do |name|
|
|
|
|
authd_db_name = name
|
2018-09-22 19:08:28 +02:00
|
|
|
end
|
|
|
|
|
2018-09-22 19:46:48 +02:00
|
|
|
parser.on "-u name", "--database-username user", "Database user." do |name|
|
|
|
|
authd_db_user = name
|
2018-09-22 19:08:28 +02:00
|
|
|
end
|
|
|
|
|
2018-09-22 19:46:48 +02:00
|
|
|
parser.on "-a host", "--hostname host", "Database host name." do |host|
|
|
|
|
authd_db_hostname = host
|
2018-09-22 19:08:28 +02:00
|
|
|
end
|
|
|
|
|
2018-09-22 19:46:48 +02:00
|
|
|
parser.on "-P file", "--password-file file", "Password file." do |file_name|
|
|
|
|
authd_db_password = File.read file_name
|
|
|
|
end
|
|
|
|
|
|
|
|
parser.on "-K file", "--key-file file", "JWT key file" do |file_name|
|
|
|
|
authd_jwt_key = File.read file_name
|
2018-09-22 19:08:28 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class User < Crecto::Model
|
|
|
|
schema "users" do # table name
|
|
|
|
field :username, String
|
|
|
|
field :realname, String
|
|
|
|
field :avatar, String
|
|
|
|
field :password, String
|
|
|
|
field :perms, Array(String)
|
|
|
|
end
|
|
|
|
|
|
|
|
validate_required [:username, :password, :perms]
|
|
|
|
|
|
|
|
def to_h
|
|
|
|
{
|
|
|
|
:username => @username,
|
|
|
|
:realname => @realname,
|
|
|
|
:perms => @perms,
|
|
|
|
:avatar => @avatar
|
|
|
|
}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
post "/token" do |env|
|
|
|
|
env.response.content_type = "application/json"
|
|
|
|
|
|
|
|
username = env.params.json["username"]?
|
|
|
|
password = env.params.json["password"]?
|
|
|
|
|
|
|
|
if ! username.is_a? String
|
|
|
|
next halt env, status_code: 400, response: ({error: "Missing username."}.to_json)
|
|
|
|
end
|
|
|
|
|
|
|
|
if ! password.is_a? String
|
|
|
|
next halt env, status_code: 400, response: ({error: "Missing password."}.to_json)
|
|
|
|
end
|
|
|
|
|
|
|
|
user = MyRepo.get_by(User, username: username, password: password)
|
|
|
|
|
|
|
|
if ! user
|
|
|
|
next halt env, status_code: 400, response: ({error: "Invalid user or password."}.to_json)
|
|
|
|
end
|
|
|
|
|
|
|
|
{
|
|
|
|
"status" => "success",
|
2018-09-22 19:46:48 +02:00
|
|
|
"token" => JWT.encode(user.to_h, authd_jwt_key, "HS256")
|
2018-09-22 19:08:28 +02:00
|
|
|
}.to_json
|
|
|
|
end
|
|
|
|
|
|
|
|
module MyRepo
|
|
|
|
extend Crecto::Repo
|
|
|
|
end
|
|
|
|
|
|
|
|
Kemal.run do
|
|
|
|
MyRepo.config do |conf|
|
|
|
|
conf.adapter = Crecto::Adapters::Postgres
|
|
|
|
conf.hostname = authd_db_hostname
|
|
|
|
conf.database = authd_db_name
|
|
|
|
conf.username = authd_db_user
|
2018-09-22 19:46:48 +02:00
|
|
|
conf.password = authd_db_password
|
2018-09-22 19:08:28 +02:00
|
|
|
end
|
|
|
|
end
|