From 61b806e485a84699f219db1ccc6bd5eec9e0c846 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 21 Dec 2021 13:05:32 -0700 Subject: [PATCH] Add an endpoint for creating an access token for a GitHub login --- crates/server/Cargo.toml | 1 + crates/server/src/api.rs | 20 +++++++++++++++++++- crates/server/src/auth.rs | 2 +- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/crates/server/Cargo.toml b/crates/server/Cargo.toml index e5e2b61a6af9f3745b03165ef9f81a9097c8698a..d11b9c4e82ea78f0367e2638042e196a8d21a200 100644 --- a/crates/server/Cargo.toml +++ b/crates/server/Cargo.toml @@ -38,6 +38,7 @@ rand = "0.8" rust-embed = { version = "6.2", features = ["include-exclude"] } scrypt = "0.7" serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" sha-1 = "0.9" surf = "2.2.0" tide = "0.16.0" diff --git a/crates/server/src/api.rs b/crates/server/src/api.rs index e9384c1f84a54a44cdc76994b52e5a6ed27c1eef..4ff31bb13ddd4153d25ed28463308db6e0b72e8e 100644 --- a/crates/server/src/api.rs +++ b/crates/server/src/api.rs @@ -1,9 +1,12 @@ -use crate::{AppState, Request, RequestExt as _}; +use crate::{auth, AppState, Request, RequestExt as _}; use async_trait::async_trait; +use serde_json::json; use std::sync::Arc; pub fn add_routes(app: &mut tide::Server>) { app.at("/users/:github_login").get(get_user); + app.at("/users/:github_login/access_tokens") + .post(create_access_token); } async fn get_user(request: Request) -> tide::Result { @@ -20,6 +23,21 @@ async fn get_user(request: Request) -> tide::Result { .build()) } +async fn create_access_token(request: Request) -> tide::Result { + request.require_token().await?; + + let user = request + .db() + .get_user_by_github_login(request.param("github_login")?) + .await? + .ok_or_else(|| surf::Error::from_str(404, "user not found"))?; + let token = auth::create_access_token(request.db(), user.id).await?; + + Ok(tide::Response::builder(200) + .body(json!({"user_id": user.id, "access_token": token})) + .build()) +} + #[async_trait] pub trait RequestExt { async fn require_token(&self) -> tide::Result<()>; diff --git a/crates/server/src/auth.rs b/crates/server/src/auth.rs index 2e2f40fca731ff993464e6b5554acc1afcdd418b..9c6142618fc787b59c407a3c35cf402789a40ec4 100644 --- a/crates/server/src/auth.rs +++ b/crates/server/src/auth.rs @@ -11,6 +11,7 @@ use oauth2::{ TokenResponse as _, TokenUrl, }; use rand::thread_rng; +use rpc::auth as zed_auth; use scrypt::{ password_hash::{PasswordHash, PasswordHasher, PasswordVerifier, SaltString}, Scrypt, @@ -19,7 +20,6 @@ use serde::{Deserialize, Serialize}; use std::{borrow::Cow, convert::TryFrom, sync::Arc}; use surf::{StatusCode, Url}; use tide::{log, Error, Server}; -use rpc::auth as zed_auth; static CURRENT_GITHUB_USER: &'static str = "current_github_user"; static GITHUB_AUTH_URL: &'static str = "https://github.com/login/oauth/authorize";