fix: Minor adjustments
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				ci/woodpecker/push/woodpecker Pipeline was successful
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	ci/woodpecker/push/woodpecker Pipeline was successful
				
			This commit is contained in:
		@@ -1,6 +1,6 @@
 | 
				
			|||||||
---
 | 
					---
 | 
				
			||||||
title: "Cryptpad"
 | 
					title: "Cryptpad"
 | 
				
			||||||
date: 2021-05-7T22:08:55+02:00
 | 
					date: 2021-05-07T22:08:55+02:00
 | 
				
			||||||
draft: true
 | 
					draft: true
 | 
				
			||||||
image: "uploads/ILMO_bordered.png"
 | 
					image: "uploads/ILMO_bordered.png"
 | 
				
			||||||
tags: [FOSS]
 | 
					tags: [FOSS]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,7 +31,16 @@ So instead, we need a proxy that stores the access token securely and restricts
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## The proxy
 | 
					## The proxy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
I wrote a short #FastAPI server for that. It only implements one method
 | 
					Such a proxie must
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* offer the endpoint that provides the same data as the FediverseAPI
 | 
				
			||||||
 | 
					* authorize itself to the FediverseAPI via `access_token`
 | 
				
			||||||
 | 
					* restrict to read access of consenting accounts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The last point is really important, as we don't want to allow others to use this endpoint to scrape data unauthorized.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I wrote a short FastAPI server that offers this. It only implements one method
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
@app.get("/api/v1/accounts/{account_id}/statuses")
 | 
					@app.get("/api/v1/accounts/{account_id}/statuses")
 | 
				
			||||||
async def fetch_data(account_id):
 | 
					async def fetch_data(account_id):
 | 
				
			||||||
@@ -39,15 +48,16 @@ async def fetch_data(account_id):
 | 
				
			|||||||
        raise HTTPException(status_code=401, detail="You can only use this proxy to access configured accounts")
 | 
					        raise HTTPException(status_code=401, detail="You can only use this proxy to access configured accounts")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    headers = {"Authorization": f"Bearer {ACCESS_TOKEN}"}
 | 
					    headers = {"Authorization": f"Bearer {ACCESS_TOKEN}"}
 | 
				
			||||||
    try:
 | 
					    response = requests.get(f"{EXTERNAL_API_BASE_URL}/api/v1/accounts/{account_id}/statuses", headers=headers)
 | 
				
			||||||
        response = requests.get(f"{EXTERNAL_API_BASE_URL}/api/v1/accounts/{account_id}/statuses", headers=headers)
 | 
					    return response.json()
 | 
				
			||||||
        response.raise_for_status()
 | 
					 | 
				
			||||||
        return response.json()
 | 
					 | 
				
			||||||
    except requests.exceptions.RequestException as e:
 | 
					 | 
				
			||||||
        raise HTTPException(status_code=502, detail=f"Error fetching data from API: {e}")
 | 
					 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Basically this is the whole API. I trimmed a few error checks and such. To deploy, I put it in a docker container and started it via docker-compose
 | 
					Basically this is the whole API code, I only trimmed a few checks and error handling.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Deployment
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To deploy, I put it in a docker container and started it via docker-compose. Reverse proxing is handled by Traefik, I won't go into detail here.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
services:
 | 
					services:
 | 
				
			||||||
  fediproxy.example.org:
 | 
					  fediproxy.example.org:
 | 
				
			||||||
@@ -77,7 +87,7 @@ networks:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
and added a short `.env` to configure.
 | 
					I added a short `.env` to configure:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
ACCESS_TOKEN=VERYSECRETTOKENTHATISDEFINETLYREAL
 | 
					ACCESS_TOKEN=VERYSECRETTOKENTHATISDEFINETLYREAL
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user