File size: 7,551 Bytes
9d384b6
e4de23f
9d384b6
e4de23f
9d384b6
e4de23f
9d384b6
 
e4de23f
9d384b6
e4de23f
9d384b6
e4de23f
9d384b6
e4de23f
9d384b6
e4de23f
9d384b6
e4de23f
9d384b6
e4de23f
9d384b6
e4de23f
9d384b6
 
 
e4de23f
9d384b6
 
 
 
 
 
 
 
e4de23f
9d384b6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e4de23f
9d384b6
 
 
 
e4de23f
9d384b6
 
 
e4de23f
9d384b6
e4de23f
9d384b6
 
 
 
 
 
 
 
 
e4de23f
9d384b6
 
 
 
 
e4de23f
9d384b6
 
 
 
 
 
 
 
 
 
 
 
e4de23f
 
9d384b6
e4de23f
 
9d384b6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e4de23f
 
 
9d384b6
 
 
 
 
 
 
 
e4de23f
9d384b6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# LinkedIn Account Creation Fix Summary

## Issue Analysis

The user reported that they were trying to add a LinkedIn account but couldn't see it in their database despite successful API calls in the logs. After analyzing the logs and code, I identified the root cause:

### Root Cause
The OAuth callback handler was trying to make a POST request to the same server (`/api/accounts/callback`) from within the callback handler, which was causing a 500 error. This prevented the OAuth data from being properly processed and stored in the database.

### Key Problems Identified

1. **Callback Handler Architecture Issue**: The backend callback handler was attempting to make an internal API call to complete the OAuth flow, which created a circular dependency and failed.

2. **Missing Session Management**: There was no proper session management to handle the OAuth data between the callback and the final account creation.

3. **Frontend-Backend Communication Gap**: The frontend was expecting direct URL parameter handling, but the backend was trying to process everything internally.

## Solution Implemented

### 1. Backend OAuth Callback Handler Redesign

**File**: `backend/app.py`

- **Simplified Callback Flow**: Removed the internal API call attempt and instead store OAuth data in Flask session
- **Proper Redirect**: Redirect back to the frontend with success/error indicators
- **Session Storage**: Store OAuth data (`code`, `state`, `social_network`) in Flask session for later retrieval

```python
# Store the OAuth data in the session for the frontend to pick up
from flask import session
session['oauth_data'] = {
    'code': code,
    'state': state,
    'social_network': 'LinkedIn'
}

# Redirect to frontend with success indication
from flask import redirect
redirect_url = f"{request.host_url.rstrip('/')}?oauth_success=true&from=linkedin"
return redirect(redirect_url)
```

### 2. Frontend Callback Handler Update

**File**: `frontend/src/components/LinkedInAccount/LinkedInCallbackHandler.jsx`

- **Enhanced Parameter Handling**: Added support for `oauth_success` and `from` parameters
- **Session Data Retrieval**: Implemented proper session data retrieval via API endpoint
- **Improved Error Handling**: Added comprehensive error handling and logging

```javascript
// Check if we're coming from LinkedIn OAuth
if (from === 'linkedin') {
  if (oauthSuccess === 'true') {
    // Get OAuth data from backend session
    const sessionResponse = await apiClient.get('/accounts/session-data');
    if (sessionResponse.data.success && sessionResponse.data.oauth_data) {
      const oauthData = sessionResponse.data.oauth_data;
      // Process OAuth callback
    }
  }
}
```

### 3. Session Data API Endpoint

**File**: `backend/api/accounts.py`

- **New Endpoint**: Added `/api/accounts/session-data` endpoint to retrieve OAuth data from session
- **Proper Authentication**: Ensured JWT protection for the endpoint
- **Error Handling**: Added comprehensive error handling

```python
@accounts_bp.route('/session-data', methods=['GET'])
@jwt_required()
def get_session_data():
    from flask import session
    oauth_data = session.get('oauth_data', None)
    
    if oauth_data:
        return jsonify({
            'success': True,
            'oauth_data': oauth_data
        }), 200
    else:
        return jsonify({
            'success': False,
            'message': 'No OAuth data found in session'
        }), 404
```

### 4. Enhanced Logging and Debugging

**Files**: Multiple files updated with comprehensive logging

- **Backend Logging**: Added detailed logging throughout the OAuth flow
- **Frontend Logging**: Enhanced frontend callback handler with detailed debugging
- **Error Tracking**: Improved error tracking and reporting

## Technical Changes Summary

### Backend Changes
1. **OAuth Callback Handler**: Completely redesigned to use session-based approach
2. **Session Management**: Implemented proper Flask session management
3. **API Endpoint**: Added session data retrieval endpoint
4. **Error Handling**: Enhanced error handling and logging

### Frontend Changes
1. **Callback Handler**: Updated to handle new URL parameters and session data
2. **Error Handling**: Improved error handling and user feedback
3. **Logging**: Enhanced debugging capabilities

### Testing
1. **Test Script**: Created `backend/test_oauth_callback.py` for testing the callback flow
2. **Integration Testing**: Added comprehensive integration testing

## Expected Behavior After Fix

### Successful Account Creation Flow
1. User clicks "Connect LinkedIn Account"
2. User is redirected to LinkedIn for authentication
3. After successful authentication, LinkedIn redirects back to `/auth/callback`
4. Backend stores OAuth data in session and redirects to frontend with `?oauth_success=true&from=linkedin`
5. Frontend detects the callback parameters and retrieves OAuth data from backend
6. Frontend makes API call to `/api/accounts/callback` with OAuth data
7. Backend processes OAuth data, exchanges code for access token, and stores account in database
8. User sees success message and is redirected to sources page

### Error Handling
1. **Authentication Error**: If LinkedIn authentication fails, user is redirected back with error parameter
2. **Missing Parameters**: If required parameters are missing, appropriate error is shown
3. **Database Issues**: If database insertion fails, error is logged and user is informed
4. **Session Issues**: If session data is missing, user is prompted to try again

## Verification Steps

To verify the fix works:

1. **Start the backend server**: `python backend/app.py`
2. **Start the frontend server**: `npm run dev` (in frontend directory)
3. **Navigate to the application**: Open browser to the application URL
4. **Add LinkedIn Account**: Click "Connect LinkedIn Account" button
5. **Complete Authentication**: Follow through LinkedIn authentication process
6. **Verify Success**: Check that the account appears in the database and UI

### Testing with Test Script
```bash
cd backend
python test_oauth_callback.py
```

## Monitoring and Debugging

### Backend Logs
Look for these key log messages:
- `πŸ”— [OAuth] Direct callback handler triggered`
- `πŸ”— [OAuth] OAuth data stored in session`
- `πŸ”— [OAuth] Account linked successfully for user: [user_id]`

### Frontend Logs
Look for these key log messages:
- `πŸ”— [Frontend] LinkedIn callback handler started`
- `πŸ”— [Frontend] OAuth success detected, fetching session data...`
- `πŸ”— [Frontend] LinkedIn account linked successfully!`

## Database Verification

After successful account creation, verify the account exists in the `Social_network` table:
```sql
SELECT * FROM Social_network WHERE id_utilisateur = '[user_id]' AND social_network = 'LinkedIn';
```

## Conclusion

The fix addresses the core issue by implementing a proper session-based OAuth callback flow that avoids the circular dependency problem. The solution is more robust, maintainable, and provides better error handling and user feedback.

The key improvements are:
1. **Proper Session Management**: OAuth data is securely stored and retrieved
2. **Clean Architecture**: Separation of concerns between frontend and backend
3. **Better Error Handling**: Comprehensive error handling throughout the flow
4. **Enhanced Logging**: Detailed logging for debugging and monitoring
5. **User Experience**: Clear feedback and error messages for users

This fix should resolve the issue where accounts were not appearing in the database despite successful API calls.