Skip to content

Feature/6222 - Endpoint /api/v1/users/sign_out revokes access token and refresh token on request#6241

Merged
FireLemons merged 7 commits intorubyforgood:mainfrom
xihai01:feature/6222
Mar 12, 2025
Merged

Feature/6222 - Endpoint /api/v1/users/sign_out revokes access token and refresh token on request#6241
FireLemons merged 7 commits intorubyforgood:mainfrom
xihai01:feature/6222

Conversation

@xihai01
Copy link
Copy Markdown
Collaborator

@xihai01 xihai01 commented Feb 24, 2025

What github issue is this PR for, if any?

Resolves #6222

What changed, and why?

Added /api/v1/users/sign_out endpoint so both the access and refresh tokens for that user is cleared from the api_credentials table and set to nil.

  • Added request and model specs for the sign out route
  • Generated and updated swagger file
  • Added helper function to api credential model to clear tokens
  • Added sign out to routes and session controller
  • Added seed data for populating tokens in api credential table in dev environment

Why?: for added security - tokens should be removed from api_credentials table because user is no longer signed in.

How is this tested? (please write tests!) 💖💪

Token Destroyer Helper Function tests (2 in total) → spec/models/api_credential_spec.rb
Sign Out Request Test for 200 and 401 Response Cases → spec/requests/api/v1/users/sessions_spec.rb

Screenshots please :)

Testing sign out with postman on localhost

Steps:
First we sign in to fetch the refresh token
Lastly we sign out and pass in refresh token in the request authorization header
Screenshot 2025-02-26 at 12 30 58 PM

Feelings gif (optional)

very strange

@xihai01 xihai01 added the codethechange for codethechange developers label Feb 24, 2025
@xihai01 xihai01 requested a review from 7riumph February 24, 2025 20:47
@xihai01 xihai01 self-assigned this Feb 24, 2025
@github-actions github-actions bot added ruby Pull requests that update Ruby code Tests! 🎉💖👏 labels Feb 24, 2025
@compwron
Copy link
Copy Markdown
Collaborator

👀

let(:casa_org) { create(:casa_org) }
let(:volunteer) { create(:volunteer, casa_org: casa_org) }
let(:api_credential) { create(:api_credential, user: volunteer) }
let(:refresh_token) { api_credential.return_new_refresh_token![:refresh_token] }
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Er, is this regenerating a refresh token a 2nd time?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think when you create the api credential table for the first time, the token digest fields are nil - at least in dev environment and so that is why I created the seed file to populate them.

I also need the plain text refresh token to be passed in the authorization header for the sign out.

Copy link
Copy Markdown
Collaborator

@7riumph 7riumph Mar 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure thing, will make note this for future issues (Keep unresolved for now)

Copy link
Copy Markdown
Collaborator

@7riumph 7riumph left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good so far, as mentioned on the issues acceptance criteria and in our discussions. Still need to...

  1. Add the sign_in route to routes.rb ( session#destroy )
  2. Add a destroy function to the sessions_controller.rb using the revocation function(s) helper you made
  3. Address comments, test route with whatever you'd like to use though my preference is curl, then should lgtm 😎

@xihai01 xihai01 marked this pull request as ready for review February 27, 2025 16:15
@7riumph
Copy link
Copy Markdown
Collaborator

7riumph commented Mar 1, 2025

@xihai01 Additionally, can you make edits to the app's sign out button itself, especially utilizing the dual token additions here

Implementing it should remove any confusion.

@xihai01
Copy link
Copy Markdown
Collaborator Author

xihai01 commented Mar 4, 2025

@xihai01 Additionally, can you make edits to the app's sign out button itself, especially utilizing the dual token additions here

Implementing it should remove any confusion.

Do we have a separate issue for the sign out button?

@7riumph
Copy link
Copy Markdown
Collaborator

7riumph commented Mar 4, 2025

@xihai01 Additionally, can you make edits to the app's sign out button itself, especially utilizing the dual token additions here
Implementing it should remove any confusion.

Do we have a separate issue for the sign out button?

No but can defiantly make one. This is the current AccountScreen with a Sign-out button.

Current behaviour is just a console log onPress={console.log('For Sign out')} would make a function using the auth base.

@xihai01
Copy link
Copy Markdown
Collaborator Author

xihai01 commented Mar 4, 2025

@xihai01 Additionally, can you make edits to the app's sign out button itself, especially utilizing the dual token additions here
Implementing it should remove any confusion.

Do we have a separate issue for the sign out button?

No but can defiantly make one. This is the current AccountScreen with a Sign-out button.

Current behaviour is just a console log onPress={console.log('For Sign out')} would make a function using the auth base.

ok I got it. I can work on this issue. Let me know if you havn't already and I will create an issue for it.

@7riumph
Copy link
Copy Markdown
Collaborator

7riumph commented Mar 4, 2025

@xihai01 Additionally, can you make edits to the app's sign out button itself, especially utilizing the dual token additions here
Implementing it should remove any confusion.

Do we have a separate issue for the sign out button?

No but can defiantly make one. This is the current AccountScreen with a Sign-out button.
Current behaviour is just a console log onPress={console.log('For Sign out')} would make a function using the auth base.

ok I got it. I can work on this issue. Let me know if you havn't already and I will create an issue for it.

Thanks, all good, here's the issue for end-to-end implementation.

@xihai01 xihai01 requested a review from 7riumph March 5, 2025 11:57
Copy link
Copy Markdown
Collaborator

@7riumph 7riumph left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fantastic, and thank you for the iOS side implementation here

@FireLemons FireLemons merged commit 75b9337 into rubyforgood:main Mar 12, 2025
17 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

codethechange for codethechange developers ruby Pull requests that update Ruby code Tests! 🎉💖👏

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Endpoint /api/v1/users/sign_out revokes access token and refresh token on request

4 participants