# tlns-google-oauth2 A server-side Google OAuth2 authentication with built in scopes for extra type safety. ## Generating scopes enums (for proc macro library part only) Go to [Google's OAuth2 Scopes Listing](https://developers.google.com/identity/protocols/oauth2/scopes) and start copying from the first header to the final row of the table at the bottom of the document. ![A picture showing the first blue header](./lmao.png) ![A picture showing the last row of the table](./help.png) Then pasting all of that to the `info.txt` and build the library, it will give you all possible scopes! ## Usage ([`crate::grouped_scopes`]) ```rust,ignore use tlns_google_oauth2::GoogleOAuth2Client as Client; use tlns_google_oauth2::scopes; let client = Client::new("CLIENT_ID".to_string(), "CLIENT_SECRET".to_string(), "http://localhost:8080/callback".to_string()).expect("Failed to build client"); let auth = client.authorize_url(None, vec![&scopes::GoogleOAuth2APIv2::AuthUserinfoProfile]).unwrap(); let url = auth.0; let csrf_token = auth.1; let scopes = auth.2; // ... Callback codes here (You can't save states in oauth2 crate for some reasons :( ) let code = "..."; let token = client.get_token(code.to_string()).await.unwrap(); // Do request stuff ``` ## Usage ([`crate::scopes::Scopes`]) ```rust,ignore use tlns_google_oauth2::GoogleOAuth2Client as Client; use tlns_google_oauth2::scopes; let client = Client::new("CLIENT_ID".to_string(), "CLIENT_SECRET".to_string(), "http://localhost:8080/callback".to_string()).expect("Failed to build client"); let auth = client.authorize_url(None, vec![&scopes::Scopes::AuthUserinfoProfile]).unwrap(); let url = auth.0; let csrf_token = auth.1; let scopes = auth.2; // ... Callback codes here (You can't save states in oauth2 crate for some reasons :( ) let code = "..."; let token = client.get_token(code.to_string()).await.unwrap(); // Do request stuff ``` ## Credits Thanks [`heapunderfl0w`](https://github.com/heapunderfl0w) for the proc macro idea instead of shitty Jinja2 implementation!