41 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """passbook OAuth2 JWKS Views"""
 | |
| from django.http import HttpRequest, HttpResponse, JsonResponse
 | |
| from django.shortcuts import get_object_or_404
 | |
| from django.views import View
 | |
| from jwkest import long_to_base64
 | |
| from jwkest.jwk import import_rsa_key
 | |
| 
 | |
| from passbook.core.models import Application
 | |
| from passbook.providers.oauth2.models import JWTAlgorithms, OAuth2Provider
 | |
| 
 | |
| 
 | |
| class JWKSView(View):
 | |
|     """Show RSA Key data for Provider"""
 | |
| 
 | |
|     def get(self, request: HttpRequest, application_slug: str) -> HttpResponse:
 | |
|         """Show RSA Key data for Provider"""
 | |
|         application = get_object_or_404(Application, slug=application_slug)
 | |
|         provider: OAuth2Provider = get_object_or_404(
 | |
|             OAuth2Provider, pk=application.provider_id
 | |
|         )
 | |
| 
 | |
|         response_data = {}
 | |
| 
 | |
|         if provider.jwt_alg == JWTAlgorithms.RS256:
 | |
|             public_key = import_rsa_key(provider.rsa_key.key_data).publickey()
 | |
|             response_data["keys"] = [
 | |
|                 {
 | |
|                     "kty": "RSA",
 | |
|                     "alg": "RS256",
 | |
|                     "use": "sig",
 | |
|                     "kid": provider.rsa_key.kid,
 | |
|                     "n": long_to_base64(public_key.n),
 | |
|                     "e": long_to_base64(public_key.e),
 | |
|                 }
 | |
|             ]
 | |
| 
 | |
|         response = JsonResponse(response_data)
 | |
|         response["Access-Control-Allow-Origin"] = "*"
 | |
| 
 | |
|         return response
 | 
