@@ -7,6 +7,9 @@ import fetch from 'cross-fetch';
77import {
88 left , right , isRight , Either ,
99} from 'fp-ts/Either' ;
10+ import { Logger } from '@aws-lambda-powertools/logger' ;
11+
12+ const logger = new Logger ( ) ;
1013
1114interface Email {
1215 email : string ;
@@ -15,7 +18,15 @@ interface Email {
1518 visibility ?: 'private' | 'public' ;
1619}
1720
18- const getUserId = async ( token : string ) : Promise < Either < number , string > > => {
21+ const getUser = async ( token : string ) : Promise < Either < {
22+ id : number ;
23+ name : string ,
24+ login : string ,
25+ html_url : string ,
26+ avatar_url : string ,
27+ blog : string ,
28+ updated_at : string
29+ } , string > > => {
1930 const response = await fetch ( 'https://api.github.com/user' , {
2031 method : 'GET' ,
2132 headers : {
@@ -28,11 +39,26 @@ const getUserId = async (token: string): Promise<Either<number, string>> => {
2839 `Cannot get user ID. status: ${ response . statusText } . ${ response . text ( ) } ` ,
2940 ) ;
3041 }
31- const { id } = ( await response . json ( ) ) as {
42+
43+ const user = ( await response . json ( ) ) as {
3244 id : number ;
45+ name : string ,
46+ login : string ,
47+ html_url : string ,
48+ avatar_url : string ,
49+ blog : string ,
50+ updated_at : string
3351 } ;
3452
35- return left ( id ) ;
53+ return left ( {
54+ id : user . id ,
55+ name : user . name ,
56+ login : user . login ,
57+ html_url : user . html_url ,
58+ avatar_url : user . avatar_url ,
59+ blog : user . blog ,
60+ updated_at : user . updated_at ,
61+ } ) ;
3662} ;
3763
3864const getValidEmail = async ( token : string ) : Promise < Either < Email , string > > => {
@@ -55,10 +81,12 @@ const getValidEmail = async (token: string): Promise<Either<Email, string>> => {
5581 visibility ?: 'private' | 'public' ;
5682 } [ ] ;
5783
84+ logger . info ( JSON . stringify ( emails ) ) ;
85+
5886 const email = emails . find (
5987 ( it ) => it . primary
6088 && it . verified
61- && it . email . trim ( ) . endsWith ( 'noreply.github.com' ) ,
89+ && ! it . email . trim ( ) . endsWith ( 'noreply.github.com' ) ,
6290 ) ;
6391 return email ? left ( email ) : right ( '/user/emails returned no valid emails' ) ;
6492} ;
@@ -70,6 +98,7 @@ APIGatewayProxyResultV2 | void
7098 const { headers } = event ;
7199 const authHeader = headers . authorization || headers . Authorization ;
72100 if ( ! authHeader ) {
101+ logger . warn ( '/userinfo request contained no accessToken' ) ;
73102 callback ( null , {
74103 statusCode : 400 ,
75104 body : '/userinfo request contained no accessToken' ,
@@ -78,6 +107,7 @@ APIGatewayProxyResultV2 | void
78107 }
79108 const authHeaderPrefix = authHeader . slice ( 0 , 'bearer ' . length ) ;
80109 if ( authHeaderPrefix . toLowerCase ( ) !== 'bearer ' ) {
110+ logger . warn ( 'authorization header does not contain bearer token' ) ;
81111 callback ( null , {
82112 statusCode : 400 ,
83113 body : 'authorization header does not contain bearer token' ,
@@ -86,39 +116,52 @@ APIGatewayProxyResultV2 | void
86116 }
87117 const token = authHeader . slice ( 'bearer ' . length ) . trim ( ) ;
88118 if ( ! token ) {
119+ logger . warn ( 'authorization header does not contain bearer token' ) ;
89120 callback ( null , {
90121 statusCode : 400 ,
91122 body : 'authorization header does not contain bearer token' ,
92123 } ) ;
93124 }
94125
95- const [ idResult , emailResult ] = await Promise . all ( [
96- getUserId ( token ) ,
126+ const [ userResult , emailResult ] = await Promise . all ( [
127+ getUser ( token ) ,
97128 getValidEmail ( token ) ,
98129 ] ) ;
99- if ( isRight ( idResult ) ) {
130+ if ( isRight ( userResult ) ) {
131+ logger . warn ( userResult . right ) ;
100132 callback ( null , {
101133 statusCode : 400 ,
102- body : `/userinfo ${ idResult . right } ` ,
134+ body : `/userinfo ${ userResult . right } ` ,
103135 } ) ;
104136 return ;
105137 }
106138 if ( isRight ( emailResult ) ) {
139+ logger . warn ( emailResult . right ) ;
107140 callback ( null , {
108141 statusCode : 400 ,
109142 body : `/userinfo ${ emailResult . right } ` ,
110143 } ) ;
111144 return ;
112145 }
113146
114- const id = idResult . left ;
147+ const user = userResult . left ;
115148 const email = emailResult . left ;
149+ const body = JSON . stringify ( {
150+ sub : user . id . toString ( ) ,
151+ name : user . name ,
152+ preferred_username : user . login ,
153+ profile : user . html_url ,
154+ picture : user . avatar_url ,
155+ website : user . blog ,
156+ updated_at : new Date ( Date . parse ( user . updated_at ) ) . getTime ( ) / 1000 ,
157+ email : email . email ,
158+ email_verified : email . verified ,
159+ } ) ;
160+
161+ logger . info ( body ) ;
162+
116163 callback ( null , {
117164 statusCode : 200 ,
118- body : JSON . stringify ( {
119- sub : id . toString ( ) ,
120- email : email . email ,
121- email_verified : email . verified ,
122- } ) ,
165+ body,
123166 } ) ;
124167} ;
0 commit comments