Skip to content

Commit bd2bc48

Browse files
committed
Add Rake task for inserting pre-generated access token into database
This task allows inserting a token into the access tokens table without already having an API token. To use this, generate a UUID or other random string, and then pass the hex encoded sha256 digest of that to the `insert` task: ```bash TOKEN="$(ruby -e "require 'securerandom'; puts SecureRandom.uuid")" TOKEN_DIGEST="$(ruby -e "require 'digest'; puts Digest::SHA256.hexdigest('$TOKEN')")" bin/rails "access_tokens:insert[$USER, $TOKEN_DIGEST]" ``` Then don't forget to save the token somewhere safe!
1 parent 325e2ee commit bd2bc48

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

lib/tasks/access_tokens.rake

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace :access_tokens do
2+
desc "Add a pre-generated token, using the SHA256 hex digest"
3+
task :insert, %i[owner token_digest] => :environment do |_, args|
4+
usage_message = "usage: rails access_tokens:insert[<owner>, <token_digest>]".freeze
5+
abort usage_message unless args[:owner].present? && args[:token_digest]&.match?(/^[a-f0-9]+$/)
6+
7+
access_token = AccessToken.create!(
8+
description: "inserted with `rails access_tokens:insert`",
9+
owner: args[:owner],
10+
token_digest: args[:token_digest],
11+
)
12+
pp(access_token)
13+
end
14+
end
+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
require "rake"
2+
3+
require "rails_helper"
4+
5+
RSpec.describe "access_tokens.rake", type: :task do
6+
before do
7+
Rake.application.rake_require "tasks/access_tokens"
8+
Rake::Task.define_task(:environment)
9+
end
10+
11+
describe "access_tokens:insert" do
12+
subject(:task) do
13+
Rake::Task["access_tokens:insert"]
14+
.tap(&:reenable)
15+
end
16+
17+
it "inserts an access token for the user" do
18+
RSpec::Matchers.define_negated_matcher :succeed, :raise_exception
19+
20+
expect { task.invoke("test.user", "baa") }
21+
.to succeed
22+
.and output(/AccessToken/).to_stdout
23+
.and change { AccessToken.find_by(token_digest: "baa") }
24+
.from(nil).to(an_object_having_attributes(owner: "test.user"))
25+
end
26+
end
27+
end

0 commit comments

Comments
 (0)