models.IdentityProvider

src/idserver/models/IdentityProvider.py
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
from typing import Optional, Any, List, Dict
from .SqlAlchemyBase import Base
from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.orm import relationship
from .DbProviderScope import DbProviderScope
from .DbProviderExtraAuthorizationParameter import DbProviderExtraAuthorizationParameter
from .UserClaimProviderMapping import UserClaimProviderMapping, DbUserClaimProviderMapping
from .IdentityProviderMetadata import IdentityProviderMetadata, DbIdentityProviderMetadata

class IdentityProvider:
    def __init__(self, provider_name: str = "", 
                        issuer: str = "", 
                        client_id: str = "", 
                        client_secret: str = "", 
                        scopes: List[str]=[], 
                        redirect_uri: str="redirect_uri",
                        extra_authorization_parameters: Dict[str, str]={},
                        user_claim_mappings: List[UserClaimProviderMapping]=[],
                        provider_metadata: IdentityProviderMetadata=None) -> None:

        self.provider_name = provider_name
        self.issuer = issuer
        self.client_id = client_id
        self.client_secret = client_secret
        self.scopes = scopes
        self.redirect_uri = redirect_uri
        self.extra_authorization_parameters = extra_authorization_parameters
        self.user_claim_mappings = user_claim_mappings
        self.provider_metadata = provider_metadata

class DbIdentityProvider(Base):
    __tablename__ = "identity_provider"

    provider_id: int = Column(Integer, primary_key=True, autoincrement=True)
    provider_name: str = Column(String, nullable=False, unique=True)
    issuer: str = Column(String(500), nullable=False)
    client_id: str = Column(String(250), nullable=False)
    client_secret: str = Column(String(2048), nullable=False)
    redirect_uri: str = Column(String(128), nullable=False)
    scopes: List[DbProviderScope] = relationship("DbProviderScope")
    extra_authorization_parameters: List[DbProviderExtraAuthorizationParameter] = relationship("DbProviderExtraAuthorizationParameter")
    user_claim_mappings: List[DbUserClaimProviderMapping] = relationship("DbUserClaimProviderMapping")
    provider_metadata: DbIdentityProviderMetadata = relationship("DbIdentityProviderMetadata")
    
    """def __init__(self, id:str, issuer: str, client_id: str, client_secret: Optional[str]=None, 
                        scope: List[str]=["openid"], extra_settings: Dict[str, Any]={}) -> None:
        self.id = id
        self.issuer = issuer
        self.client_id = client_id
        self.client_secret = client_secret
        self.scope = scope
        self.extra_settings = extra_settings"""
    
    def toIdentityProvider(self) -> IdentityProvider:
        scopes: List[str] = []
        for scope in self.scopes:
            scopes.append(scope.scope)
        extra_auth_parameters: Dict[str, str] = {}
        for extra_auth_parameter in self.extra_authorization_parameters:
            extra_auth_parameters[extra_auth_parameter.parameter_name] = extra_auth_parameter.parameter_value
        
        claim_mapping: List[UserClaimProviderMapping] = []
        for user_claim_mapping in self.user_claim_mappings:
            claim_mapping.append(user_claim_mapping.toUserClaimProviderMapping())

        return IdentityProvider(provider_name=self.provider_name, 
                                issuer=self.issuer, 
                                client_id=self.client_id, 
                                client_secret=self.client_secret, 
                                scopes=scopes, 
                                redirect_uri=self.redirect_uri,
                                extra_authorization_parameters=extra_auth_parameters,
                                user_claim_mappings=claim_mapping,
                                provider_metadata=self.provider_metadata[0].toIdentityProviderMetadata())