A Ruby wrapper for OAuth 1.0, and 1.0a protocols; clients & servers
A Ruby wrapper for OAuth 1.0, and 1.0a protocols; clients & servers
[![Version][versioni]][version] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: MIT][license-img]][license] [![Downloads Rank][dl-ranki]][dl-rank] [![CodeCov Test Coverage][codecovi]][codecov] [![Coveralls Test Coverage][coveralls-img]][coveralls] [![QLTY Test Coverage][qlty-covi]][qlty-cov] [![QLTY Maintainability][qlty-mnti]][qlty-mnt] [![CI Heads][3-hd-wfi]][3-hd-wf] [![CI Runtime Dependencies @ HEAD][12-crh-wfi]][12-crh-wf] [![CI Current][11-c-wfi]][11-c-wf] [![CI Truffle Ruby][9-t-wfi]][9-t-wf] [![CI JRuby][10-j-wfi]][10-j-wf] [![Deps Locked][13-️-wfi]][13-️-wf] [![Deps Unlocked][14-️-wfi]][14-️-wf] [![CI Test Coverage][2-cov-wfi]][2-cov-wf] [![CI Style][5-st-wfi]][5-st-wf] [![Apache SkyWalking Eyes License Compatibility Check][15--wfi]][15--wf]
if ci_badges.map(&:color).detect { it != "green"} ☝️ [let me know][✉️discord-invite], as I may have missed the [discord notification][✉️discord-invite].
if ci_badges.map(&:color).all? { it == "green"} ️ send money so I can do more of this. FLOSS maintenance is now my full-time job.
[![OpenCollective Backers][osc-backers-i]][osc-backers] [![OpenCollective Sponsors][osc-sponsors-i]][osc-sponsors] [![Sponsor Me on Github][sponsor-img]][sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][paypal-img]][paypal] [![Buy me a coffee][buyme-small-img]][buyme] [![Donate at ko-fi.com][kofi-img]][kofi]
How will this project approach the September 2025 hostile takeover of RubyGems? ️
I've summarized my thoughts in this blog post.
OAuth 1.0a is an industry-standard protocol for authorization. It is an update to the original OAuth 1.0 protocol, and is used by many popular services.
This is a RubyGem for implementing OAuth 1.0 or 1.0a clients and servers in Ruby applications.
See the sibling oauth2 gem for OAuth 2.0, 2.1, & OIDC clients in Ruby.
All dependencies of this gem are signed, so it can be installed with a HighSecurity profile.
This gem targets the OAuth 1.0a behavior (the errata that became RFC 5849), while maintaining compatibility with providers that still behave like classic 1.0. Here are the key differences between the two and how this gem handles them:
Practical guidance:
References: RFC 5849 (OAuth 1.0), sections 5–7; 1.0a security errata.
Ruby OAuth has been maintained by a large number of talented individuals over the years. The primary maintainer since 2020 is Peter Boling (@pboling).
| Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
|---|---|
| Works with JRuby | [![JRuby 9.2 Compat][jruby-9.2i]][jruby-9.2-wf] [![JRuby 9.3 Compat][jruby-9.3i]][jruby-9.3-wf] |
| [![JRuby 9.4 Compat][jruby-9.4i]][jruby-9.4-wf] [![JRuby 10.0 Compat][jruby-10.0i]][jruby-10.0-wf] [![JRuby current Compat][jruby-c-i]][10-j-wf] [![JRuby HEAD Compat][jruby-headi]][3-hd-wf] | |
| Works with Truffle Ruby | [![Truffle Ruby 22.3 Compat][truby-22.3i]][truby-22.3-wf] [![Truffle Ruby 23.0 Compat][truby-23.0i]][truby-23.0-wf] [![Truffle Ruby 23.1 Compat][truby-23.1i]][truby-23.1-wf] |
| [![Truffle Ruby 24.2 Compat][truby-24.2i]][truby-24.2-wf] [![Truffle Ruby 25.0 Compat][truby-25.0i]][truby-25.0-wf] [![Truffle Ruby 33.0 Compat][truby-33.0i]][truby-33.0-wf] [![Truffle Ruby current Compat][truby-c-i]][9-t-wf] [![Truffle Ruby HEAD Compat][truby-headi]][3-hd-wf] | |
| Works with MRI Ruby 4 | [![Ruby current Compat][ruby-c-i]][11-c-wf] [![Ruby HEAD Compat][ruby-headi]][3-hd-wf] |
| Works with MRI Ruby 3 | [![Ruby 3.0 Compat][ruby-3.0i]][ruby-3.0-wf] [![Ruby 3.1 Compat][ruby-3.1i]][ruby-3.1-wf] [![Ruby 3.2 Compat][ruby-3.2i]][ruby-3.2-wf] [![Ruby 3.3 Compat][ruby-3.3i]][ruby-3.3-wf] [![Ruby 3.4 Compat][ruby-3.4i]][ruby-3.4-wf] |
| Works with MRI Ruby 2 | ![Ruby 2.3 Compat][ruby-2.3i] |
| [![Ruby 2.4 Compat][ruby-2.4i]][ruby-2.4-wf] [![Ruby 2.5 Compat][ruby-2.5i]][ruby-2.5-wf] [![Ruby 2.6 Compat][ruby-2.6i]][ruby-2.6-wf] [![Ruby 2.7 Compat][ruby-2.7i]][ruby-2.7-wf] | |
| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][expsup-upwork-img]][expsup-upwork] [![Get help from me on Codementor][expsup-codementor-img]][expsup-codementor] |
| Source | [![Source on GitLab.com][src-gl-img]][src-gl] [![Source on CodeBerg.org][src-cb-img]][src-cb] [![Source on Github.com][src-gh-img]][src-gh] [![The best SHA: dQw4w9WgXcQ!][kloc-img]][kloc] |
| Documentation | [![Current release on RubyDoc.info][docs-cr-rd-img]][yard-current] [![YARD on Galtzo.com][docs-head-rd-img]][yard-head] [![Maintainer Blog][maint-blog-img]][maint-blog] [![GitLab Wiki][gl-wiki-img]][gl-wiki] [![GitHub Wiki][gh-wiki-img]][gh-wiki] |
| Compliance | [![License: MIT][license-img]][license] [![Apache license compatibility: Category A][license-compat-img]][license-compat] [![ilo-declaration-img]][ilo-declaration] [![Security Policy][security-img]][security] [![Contributor Covenant 2.1][conduct-img]][conduct] [![SemVer 2.0.0][semver-img]][semver] |
| Style | [![Enforced Code Style Linter][rlts-img]][rlts] [![Keep-A-Changelog 1.0.0][keep-changelog-img]][keep-changelog] [![Gitmoji Commits][gitmoji-img]][gitmoji] [![Compatibility appraised by: appraisal2][appraisal2-img]][appraisal2] |
| Maintainer ️ | [![Follow Me on LinkedIn][linkedin-img]][linkedin] [![Follow Me on Ruby.Social][ruby-mast-img]][ruby-mast] [![Follow Me on Bluesky][bluesky-img]][bluesky] [![Contact Maintainer][maint-contact-img]][maint-contact] [![My technical writing][♂️devto-img]][♂️devto] |
... |
[![Find Me on WellFound:][✌️wellfound-img]][✌️wellfound] [![Find Me on CrunchBase][crunchbase-img]][crunchbase] [![My LinkTree][linktree-img]][linktree] [![More About Me][♂️aboutme-img]][♂️aboutme] [][berg] [][hub] [][hut] [][lab] |
Compatible with MRI Ruby 2.3+, and concordant releases of JRuby, and TruffleRuby.
CI workflows and Appraisals are generated for MRI Ruby 2.4+.
This test floor is configured by ruby.test_minimum in .kettle-jem.yml and
may be higher than the gem's runtime compatibility floor when legacy Rubies are
not practical for the current toolchain.
The amazing test matrix is powered by the kettle-dev stack.
How kettle-dev manages complexity in tests
| Gem | Source | Role | Daily download rank |
|---|---|---|---|
| appraisal2 | GitHub | multi-dependency Appraisal matrix generation | |
| appraisal2-rubocop | GitHub | RuboCop Appraisal generator integration | |
| kettle-dev | GitHub | development, release, and CI workflow tooling | |
| kettle-jem | GitHub | Appraisals & CI workflow templates | |
| kettle-soup-cover | GitHub | SimpleCov coverage policy and reporting | |
| kettle-test | GitHub | standard test runner and coverage harness | |
| rubocop-lts | GitHub | Ruby-version-aware linting | |
| turbo_tests2 | GitHub | parallel test execution |
Find this repo on federated forges (Coming soon!)
No open issues yet, or sync has not completed.