@@ -6,6 +6,7 @@ use crate::identity_provider::*;
6
6
use crate :: types;
7
7
use crate :: types:: { IdentityProvider , IntrospectRequest , TokenRequest , TokenResponse } ;
8
8
use axum:: extract:: State ;
9
+ use axum:: http:: header:: CONTENT_TYPE ;
9
10
use axum:: http:: StatusCode ;
10
11
use axum:: response:: { IntoResponse , Response } ;
11
12
use axum:: Json ;
@@ -14,52 +15,65 @@ use jsonwebtoken::Algorithm::RS512;
14
15
use jsonwebtoken:: DecodingKey ;
15
16
use log:: error;
16
17
use std:: sync:: Arc ;
17
- use axum:: http:: header:: CONTENT_TYPE ;
18
18
use thiserror:: Error ;
19
19
use tokio:: sync:: RwLock ;
20
20
21
21
#[ axum:: debug_handler]
22
- pub async fn token ( State ( state) : State < HandlerState > , JsonOrForm ( request) : JsonOrForm < TokenRequest > ) -> Result < impl IntoResponse , ApiError > {
22
+ pub async fn token (
23
+ State ( state) : State < HandlerState > ,
24
+ JsonOrForm ( request) : JsonOrForm < TokenRequest > ,
25
+ ) -> Result < impl IntoResponse , ApiError > {
23
26
let endpoint = state. token_endpoint ( & request. identity_provider ) . await ;
24
- let params = state. token_request ( & request. identity_provider , request. target ) . await ;
27
+ let params = state
28
+ . token_request ( & request. identity_provider , request. target )
29
+ . await ;
25
30
26
31
let client = reqwest:: Client :: new ( ) ;
27
- let request_builder = client. post ( endpoint)
32
+ let request_builder = client
33
+ . post ( endpoint)
28
34
. header ( "accept" , "application/json" )
29
35
. form ( & params) ;
30
36
31
37
let response = request_builder
32
38
. send ( )
33
39
. await
34
- . map_err ( ApiError :: UpstreamRequest ) ?
35
- ;
40
+ . map_err ( ApiError :: UpstreamRequest ) ?;
36
41
37
42
if response. status ( ) >= StatusCode :: BAD_REQUEST {
38
43
let err: types:: ErrorResponse = response. json ( ) . await . map_err ( ApiError :: JSON ) ?;
39
44
return Err ( ApiError :: Upstream ( err) ) ;
40
45
}
41
46
42
47
let res: TokenResponse = response
43
- . json ( ) . await
44
- . inspect_err ( |err| {
45
- error ! ( "Identity provider returned invalid JSON: {:?}" , err)
46
- } )
47
- . map_err ( ApiError :: JSON ) ?
48
- ;
48
+ . json ( )
49
+ . await
50
+ . inspect_err ( |err| error ! ( "Identity provider returned invalid JSON: {:?}" , err) )
51
+ . map_err ( ApiError :: JSON ) ?;
49
52
50
53
Ok ( ( StatusCode :: OK , Json ( res) ) )
51
54
}
52
55
53
- pub async fn introspection ( State ( state) : State < HandlerState > , Json ( request) : Json < IntrospectRequest > ) -> Result < impl IntoResponse , ApiError > {
56
+ pub async fn introspection (
57
+ State ( state) : State < HandlerState > ,
58
+ Json ( request) : Json < IntrospectRequest > ,
59
+ ) -> Result < impl IntoResponse , ApiError > {
54
60
// Need to decode the token to get the issuer before we actually validate it.
55
61
let mut validation = jwt:: Validation :: new ( RS512 ) ;
56
62
validation. validate_exp = false ;
57
63
validation. insecure_disable_signature_validation ( ) ;
58
64
let key = DecodingKey :: from_secret ( & [ ] ) ;
59
- let token_data = jwt:: decode :: < Claims > ( & request. token , & key, & validation) . map_err ( ApiError :: Validate ) ?;
65
+ let token_data =
66
+ jwt:: decode :: < Claims > ( & request. token , & key, & validation) . map_err ( ApiError :: Validate ) ?;
60
67
61
68
let claims = match token_data. claims . iss {
62
- s if s == state. cfg . maskinporten_issuer => state. maskinporten . write ( ) . await . introspect ( request. token ) . await ,
69
+ s if s == state. cfg . maskinporten_issuer => {
70
+ state
71
+ . maskinporten
72
+ . write ( )
73
+ . await
74
+ . introspect ( request. token )
75
+ . await
76
+ }
63
77
_ => panic ! ( "Unknown issuer: {}" , token_data. claims. iss) ,
64
78
} ;
65
79
@@ -74,7 +88,11 @@ pub struct HandlerState {
74
88
}
75
89
76
90
impl HandlerState {
77
- async fn token_request ( & self , identity_provider : & IdentityProvider , target : String ) -> Box < dyn erased_serde:: Serialize + Send > {
91
+ async fn token_request (
92
+ & self ,
93
+ identity_provider : & IdentityProvider ,
94
+ target : String ,
95
+ ) -> Box < dyn erased_serde:: Serialize + Send > {
78
96
match identity_provider {
79
97
IdentityProvider :: EntraID => todo ! ( ) ,
80
98
IdentityProvider :: TokenX => todo ! ( ) ,
@@ -88,9 +106,7 @@ impl HandlerState {
88
106
match identity_provider {
89
107
IdentityProvider :: EntraID => todo ! ( ) ,
90
108
IdentityProvider :: TokenX => todo ! ( ) ,
91
- IdentityProvider :: Maskinporten => {
92
- self . maskinporten . read ( ) . await . token_endpoint ( )
93
- }
109
+ IdentityProvider :: Maskinporten => self . maskinporten . read ( ) . await . token_endpoint ( ) ,
94
110
}
95
111
}
96
112
}
@@ -113,19 +129,15 @@ pub enum ApiError {
113
129
impl IntoResponse for ApiError {
114
130
fn into_response ( self ) -> Response {
115
131
match & self {
116
- ApiError :: UpstreamRequest ( err) => {
117
- ( err. status ( ) . unwrap_or ( StatusCode :: INTERNAL_SERVER_ERROR ) , self . to_string ( ) )
118
- }
119
- ApiError :: JSON ( _) => {
120
- ( StatusCode :: INTERNAL_SERVER_ERROR , self . to_string ( ) )
121
- }
122
- ApiError :: Upstream ( _err) => {
123
- ( StatusCode :: INTERNAL_SERVER_ERROR , self . to_string ( ) )
124
- }
125
- ApiError :: Validate ( _) => {
126
- ( StatusCode :: BAD_REQUEST , self . to_string ( ) )
127
- }
128
- } . into_response ( )
132
+ ApiError :: UpstreamRequest ( err) => (
133
+ err. status ( ) . unwrap_or ( StatusCode :: INTERNAL_SERVER_ERROR ) ,
134
+ self . to_string ( ) ,
135
+ ) ,
136
+ ApiError :: JSON ( _) => ( StatusCode :: INTERNAL_SERVER_ERROR , self . to_string ( ) ) ,
137
+ ApiError :: Upstream ( _err) => ( StatusCode :: INTERNAL_SERVER_ERROR , self . to_string ( ) ) ,
138
+ ApiError :: Validate ( _) => ( StatusCode :: BAD_REQUEST , self . to_string ( ) ) ,
139
+ }
140
+ . into_response ( )
129
141
}
130
142
}
131
143
0 commit comments