Archives de catégorie : Code

Integrating OpenIdConnect with FastAPI’s OpenAPI UI

FastAPI is a powerful tool for building APIs with Python, but it doesn’t fully support OpenIdConnect out of the box. However, with a bit of tweaking, you can set up FastAPI’s OpenAPI UI (Swagger UI) to use OpenIdConnect authentication across all routes. This is particularly useful if you’re using an identity provider like Keycloak without having to set it inside your routes.

This is particularly useful in combination with the fastapi keycloak plugin, which doesn’t parameterize the openapi part.

What is OpenIdConnect?


OpenIdConnect is an identity layer on top of the OAuth 2.0 protocol, allowing clients to verify the identity of the end-user based on the authentication performed by an authorization server.

Setting Up OpenIdConnect in FastAPI for OpenApi


To set up OpenIdConnect in FastAPI, you need to modify the OpenAPI schema. Here’s an example:

app = FastAPI()
...
if app.openapi_schema:
    app.openapi_schema["components"]["securitySchemes"]["openId"] = {
        "type": "openIdConnect",
        "openIdConnectUrl": "https://yourkeycloakurl.com/realms/yourrealm/.well-known/openid-configuration",
    }
    app.openapi_schema["security"] = [{"openId": ["read", "write"]}]


In this code:

We’re adding a new security scheme to the OpenAPI schema. The type is openIdConnect, and the openIdConnectUrl is the well-known configuration URL of your OpenIdConnect provider (like Keycloak).
We’re setting the security property of the schema to use the OpenIdConnect scheme. The [« read », « write »] array represents the scopes that the OpenIdConnect provider should request. In this case, all our endpoints.


Wrapping Up


This approach allows you to set up OpenIdConnect authentication across all routes in FastAPI’s OpenAPI UI, without needing to manually configure each route. It’s a handy trick if you’re using an identity provider like Keycloak and want to leverage OpenIdConnect for your FastAPI application.

References

Flutter – Scrollable dialog with Getx

To have a scrollable dialog with Getx, you have multiple possibilities.

1. With Get.dialog

Get.dialog(
  Container(
    width: double.maxFinite,
    child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        mainAxisSize: MainAxisSize.min,
        children: [
          Text("Description 1",
              style:
                  TextStyle(fontWeight: FontWeight.bold)),
          SizedBox(height: 8),
          Flexible(
            child: SingleChildScrollView(
              child: Text('Very, very large title',
                  textScaleFactor: 15),
            ),
          ),
          ElevatedButton(
            onPressed: () {
              Navigator.of(context).pop();
            },
            child: Text("OK"),
          )
        ]),
  ),
);

2. With Get.defaultDialog

Get.defaultDialog(
  content: Flexible(
    child: SingleChildScrollView(
      child: Text('Very, very large title',
                  textScaleFactor: 15),
    ),
  ),
);

3. By combining Get.dialog and AlertDialog

Get.dialog(AlertDialog(
  content: Container(
    width: double.maxFinite,
    child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        mainAxisSize: MainAxisSize.min,
        children: [
          Text("Description 1",
              style:
                  TextStyle(fontWeight: FontWeight.bold)),
          SizedBox(height: 8),
          Flexible(
            child: SingleChildScrollView(
              child: Text('Very, very large title',
                  textScaleFactor: 15),
            ),
          ),
          ElevatedButton(
            onPressed: () {
              Navigator.of(context).pop();
            },
            child: Text("OK"),
          )
        ]),
  ),
));

Go get and Fork – script helper workaround

Why

If you write some Golang code, from my point of view, one of biggest pitfall of this language is dependency management.

At the beginning, get library directly from git repository seems a good idea, but between package rules, versions, your pull requests, it becomes a mess quickly.

Some sources on this problem:
Article: Forking Golang repositories on GitHub and managing the import path

StackOverflow : Using forked package import in Go

My workaround

Then, why not automate this procedure ?
In your .bashrc add:

function gofork() {
  if [ $# -ne 2 ] || [ -z "$1" ] || [ -z "$2" ]; then
    echo 'Usage: gofork yourFork originalModule'
    echo 'Example: golang github.com/YourName/go-contrib github.com/heirko/go-contrib'
    return
  fi
   echo "Go get fork $1 and replace $2 in GOPATH: $GOPATH"
   go get $1
   go get $2
   currentDir=$PWD
   cd $GOPATH/src/$1
   remote1=$(git config --get remote.origin.url)
   cd $GOPATH/src/$2
   remote2=$(git config --get remote.origin.url)
   cd $currentDir
   rm -rf $GOPATH/src/$2
   mv $GOPATH/src/$1 $GOPATH/src/$2
   cd $GOPATH/src/$2
   git remote add their $remote2
   echo Now in $GOPATH/src/$2 origin remote is $remote1
   echo And in $GOPATH/src/$2 their remote is $remote2
   cd $currentDir
}

export -f gofork

This command do

  • a ‘go get’ on source and fork repositories
  • extract remote urls
  • replace source code by fork
  • add source remote to your fork repository in case you want pull from source

You can call this script from command line or directly from a script like this:

gofork github.com/heralight/baloo gopkg.in/h2non/baloo.v2