Source code#
        
extension_root.com_longgui_app_protocol_oidc.OAuth2ServerExtension            (AppProtocolExtension)
        
#
    Source code in extension_root/com_longgui_app_protocol_oidc/__init__.py
          class OAuth2ServerExtension(AppProtocolExtension):
    def load(self):
        # 加载url地址
        self.load_urls()
        # 加载相应的view
        self.load_auth_view()
        # 加载相应的配置文件
        if not settings.IS_CENTRAL_ARKID:
            self.register_app_protocol_schema(OIDCConfigSchema, 'OIDC')
            self.register_app_protocol_schema(Oauth2ConfigSchema, 'OAuth2')
        super().load()
    def load_urls(self):
        self.register_routers(urls, True)
    def load_auth_view(self):
        # 加载认证view
        auth_view = AuthorizationView.as_view()
        auth_path = r"app/(?P<app_id>[\w-]+)/oauth/authorize/$"
        url_name = "authorize"
        type = ['OIDC', 'OAuth2']
        self.register_enter_view(auth_view, auth_path, url_name, type)
    def create_app(self, event, **kwargs):
        config = event.data["config"]
        return self.update_app_data(event, config, True)
    def update_app(self, event, **kwargs):
        config = event.data["config"]
        return self.update_app_data(event, config, False)
    def delete_app(self, event, **kwargs):
        Application.objects.filter(uuid=event.data.id).delete()
        return True
    def update_app_data(self, event, config, is_create):
        '''
        修改应用程序
        '''
        app = event.data["app"]
        tenant = event.tenant
        client_type = config["client_type"]
        redirect_uris = config["redirect_uris"]
        grant_type = config["grant_type"]
        skip_authorization = config["skip_authorization"]
        app_type = event.data.get("app_type")
        algorithm = config.get("algorithm",None)
        obj,iscreated = Application.objects.get_or_create(uuid=app.id)                                                                                
        obj.name = app.name
        obj.client_type = client_type
        obj.redirect_uris = redirect_uris
        obj.skip_authorization = skip_authorization
        obj.authorization_grant_type = grant_type
        if algorithm and app_type == 'OIDC':
            obj.algorithm = algorithm
        obj.save()
        # 更新地址信息
        self.update_url_data(tenant.id, config, obj)
        return True
    def update_url_data(self, tenant_id, config, obj):
        '''
        更新配置中的url信息
        '''
        host = get_app_config().get_frontend_host()
        namespace = f'api:{self.pname}_tenant'
        config["userinfo"] = host+reverse(namespace+":oauth-user-info", args=[tenant_id])
        config["authorize"] = host+reverse(namespace+":authorize", args=[tenant_id, obj.uuid])
        config["token"] = host+reverse(namespace+":token", args=[tenant_id])
        config["logout"] = host+reverse(namespace+":oauth-user-logout", args=[tenant_id])
        config["issuer_url"] = "{}/api/v1/tenant/{}/app/{}".format(host,tenant_id,obj.uuid)
        config["client_id"] = obj.client_id
        config["client_secret"] = obj.client_secret
        config["skip_authorization"] = obj.skip_authorization
create_app(self, event, **kwargs)
#
    抽象方法,创建应用
Parameters:
| Name | Type | Description | Default | 
|---|---|---|---|
| event | 事件参数 | required | |
| kwargs | 其它方法参数 | {} | 
Returns:
| Type | Description | 
|---|---|
| bool | 是否成功执行 | 
delete_app(self, event, **kwargs)
#
    抽象方法,删除应用
Parameters:
| Name | Type | Description | Default | 
|---|---|---|---|
| event | 事件参数 | required | |
| kwargs | 其它方法参数 | {} | 
Returns:
| Type | Description | 
|---|---|
| bool | 是否成功执行 | 
load(self)
#
    抽象方法,插件加载的入口方法
Source code in extension_root/com_longgui_app_protocol_oidc/__init__.py
          
        
update_app(self, event, **kwargs)
#
    抽象方法,修改应用
Parameters:
| Name | Type | Description | Default | 
|---|---|---|---|
| event | 事件参数 | required | |
| kwargs | 其它方法参数 | {} | 
Returns:
| Type | Description | 
|---|---|
| bool | 是否成功执行 | 
update_app_data(self, event, config, is_create)
#
    修改应用程序
Source code in extension_root/com_longgui_app_protocol_oidc/__init__.py
          def update_app_data(self, event, config, is_create):
    '''
    修改应用程序
    '''
    app = event.data["app"]
    tenant = event.tenant
    client_type = config["client_type"]
    redirect_uris = config["redirect_uris"]
    grant_type = config["grant_type"]
    skip_authorization = config["skip_authorization"]
    app_type = event.data.get("app_type")
    algorithm = config.get("algorithm",None)
    obj,iscreated = Application.objects.get_or_create(uuid=app.id)                                                                                
    obj.name = app.name
    obj.client_type = client_type
    obj.redirect_uris = redirect_uris
    obj.skip_authorization = skip_authorization
    obj.authorization_grant_type = grant_type
    if algorithm and app_type == 'OIDC':
        obj.algorithm = algorithm
    obj.save()
    # 更新地址信息
    self.update_url_data(tenant.id, config, obj)
    return True
update_url_data(self, tenant_id, config, obj)
#
    更新配置中的url信息
Source code in extension_root/com_longgui_app_protocol_oidc/__init__.py
          def update_url_data(self, tenant_id, config, obj):
    '''
    更新配置中的url信息
    '''
    host = get_app_config().get_frontend_host()
    namespace = f'api:{self.pname}_tenant'
    config["userinfo"] = host+reverse(namespace+":oauth-user-info", args=[tenant_id])
    config["authorize"] = host+reverse(namespace+":authorize", args=[tenant_id, obj.uuid])
    config["token"] = host+reverse(namespace+":token", args=[tenant_id])
    config["logout"] = host+reverse(namespace+":oauth-user-logout", args=[tenant_id])
    config["issuer_url"] = "{}/api/v1/tenant/{}/app/{}".format(host,tenant_id,obj.uuid)
    config["client_id"] = obj.client_id
    config["client_secret"] = obj.client_secret
    config["skip_authorization"] = obj.skip_authorization