@@ -89,6 +89,8 @@ func OAuthCallbackHandler() gin.HandlerFunc {
8989 user , err = processMicrosoftUserInfo (ctx , oauthCode )
9090 case constants .AuthRecipeMethodTwitch :
9191 user , err = processTwitchUserInfo (ctx , oauthCode )
92+ case constants .AuthRecipeMethodRoblox :
93+ user , err = processRobloxUserInfo (ctx , oauthCode , sessionState )
9294 default :
9395 log .Info ("Invalid oauth provider" )
9496 err = fmt .Errorf (`invalid oauth provider` )
@@ -818,3 +820,68 @@ func processTwitchUserInfo(ctx context.Context, code string) (*models.User, erro
818820
819821 return user , nil
820822}
823+
824+ // process roblox user information
825+ func processRobloxUserInfo (ctx context.Context , code , verifier string ) (* models.User , error ) {
826+ oauth2Token , err := oauth .OAuthProviders .RobloxConfig .Exchange (ctx , code , oauth2 .SetAuthURLParam ("code_verifier" , verifier ))
827+ if err != nil {
828+ log .Debug ("Failed to exchange code for token: " , err )
829+ return nil , fmt .Errorf ("invalid roblox exchange code: %s" , err .Error ())
830+ }
831+
832+ client := http.Client {}
833+ req , err := http .NewRequest ("GET" , constants .RobloxUserInfoURL , nil )
834+ if err != nil {
835+ log .Debug ("Failed to create roblox user info request: " , err )
836+ return nil , fmt .Errorf ("error creating roblox user info request: %s" , err .Error ())
837+ }
838+ req .Header = http.Header {
839+ "Authorization" : []string {fmt .Sprintf ("Bearer %s" , oauth2Token .AccessToken )},
840+ }
841+
842+ response , err := client .Do (req )
843+ if err != nil {
844+ log .Debug ("Failed to request roblox user info: " , err )
845+ return nil , err
846+ }
847+
848+ defer response .Body .Close ()
849+ body , err := io .ReadAll (response .Body )
850+ if err != nil {
851+ log .Debug ("Failed to read roblox user info response body: " , err )
852+ return nil , fmt .Errorf ("failed to read roblox response body: %s" , err .Error ())
853+ }
854+
855+ if response .StatusCode >= 400 {
856+ log .Debug ("Failed to request roblox user info: " , string (body ))
857+ return nil , fmt .Errorf ("failed to request roblox user info: %s" , string (body ))
858+ }
859+
860+ userRawData := make (map [string ]interface {})
861+ json .Unmarshal (body , & userRawData )
862+
863+ // log.Info(userRawData)
864+ nameArr := strings .SplitAfterN (userRawData ["name" ].(string ), " " , 2 )
865+ firstName := nameArr [0 ]
866+ lastName := ""
867+ if len (nameArr ) == 2 {
868+ lastName = nameArr [1 ]
869+ }
870+ nickname := userRawData ["nickname" ].(string )
871+ profilePicture := userRawData ["picture" ].(string )
872+ email := ""
873+ if val , ok := userRawData ["email" ]; ok {
874+ email = val .(string )
875+ } else {
876+ email = userRawData ["preferred_username" ].(string )
877+ }
878+ user := & models.User {
879+ GivenName : & firstName ,
880+ FamilyName : & lastName ,
881+ Picture : & profilePicture ,
882+ Nickname : & nickname ,
883+ Email : & email ,
884+ }
885+
886+ return user , nil
887+ }
0 commit comments