Skip to content

Commit

Permalink
Merge pull request #2 from rano-oss/provider/microsoft
Browse files Browse the repository at this point in the history
Added microsoft provider
  • Loading branch information
torto authored May 9, 2024
2 parents 5473829 + 8bb947a commit a10ffc0
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ To use it, it's very simple. Just create a new instance of some provider:
- DiscordProvider
- TwitterProvider
- GoogleProvider
- MicrosoftProvider
- FacebookProvider
- SpotifyProvider

Expand Down
67 changes: 67 additions & 0 deletions examples/microsoft.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
mod utils;
use std::sync::Arc;

use axum::extract::Query;
use axum::Router;
use axum::{routing::get, Extension};
use oauth_axum::providers::microsoft::MicrosoftProvider;
use oauth_axum::{CustomProvider, OAuthClient};

use crate::utils::memory_db_util::AxumState;

#[derive(Clone, serde::Deserialize)]
pub struct QueryAxumCallback {
pub code: String,
pub state: String,
}

#[tokio::main]
async fn main() {
dotenv::from_filename("examples/.env").ok();
println!("Starting server...");

let state = Arc::new(AxumState::new());
let app = Router::new()
.route("/", get(create_url))
.route("/api/v1/microsoft/callback", get(callback))
.layer(Extension(state.clone()));

println!("🚀 Server started successfully");
let listener = tokio::net::TcpListener::bind("127.0.0.1:3000")
.await
.unwrap();
axum::serve(listener, app).await.unwrap();
}

fn get_client() -> CustomProvider {
MicrosoftProvider::new(
std::env::var("MICROSOFT_TENANT_ID").expect("MICROSOFT_TENANT_ID must be set"),
std::env::var("MICROSOFT_CLIENT_ID").expect("MICROSOFT_CLIENT_ID must be set"),
std::env::var("MICROSOFT_SECRET").expect("MICROSOFT_SECRET must be set"),
"http://localhost:3000/api/v1/microsoft/callback".to_string(),
)
}

pub async fn create_url(Extension(state): Extension<Arc<AxumState>>) -> String {
let state_oauth = get_client()
.generate_url(Vec::from(["User.Read".to_string()]), |state_e| async move {
state.set(state_e.state, state_e.verifier);
})
.await
.unwrap()
.state
.unwrap();

state_oauth.url_generated.unwrap()
}

pub async fn callback(
Extension(state): Extension<Arc<AxumState>>,
Query(queries): Query<QueryAxumCallback>,
) -> String {
println!("{:?}", state.clone().get_all_items());
let item = state.get(queries.state.clone());
get_client()
.generate_token(queries.code, item.unwrap())
.await
}
1 change: 1 addition & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
//! - DiscordProvider
//! - TwitterProvider
//! - GoogleProvider
//! - MicrosoftProvider
//! - FacebookProvider
//! - SpotifyProvider
//!
Expand Down
23 changes: 23 additions & 0 deletions src/providers/microsoft.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
use crate::CustomProvider;

pub struct MicrosoftProvider {}

impl MicrosoftProvider {
pub fn new(
tenant_id: String,
client_id: String,
client_secret: String,
redirect_url: String,
) -> CustomProvider {
let base_url = String::from(
"https://login.microsoftonline.com/".to_string() + tenant_id.as_str() + "/oauth2/v2.0",
);
CustomProvider::new(
String::from(base_url.clone() + "/authorize"),
String::from(base_url + "/token"),
client_id,
client_secret,
redirect_url,
)
}
}
1 change: 1 addition & 0 deletions src/providers/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@ pub mod discord;
pub mod facebook;
pub mod github;
pub mod google;
pub mod microsoft;
pub mod spotify;
pub mod twitter;

0 comments on commit a10ffc0

Please sign in to comment.