Wieso, weshalb, warum: Weil man‘s kann: Sony Fernseher updaten

Früher hat man sich einen Fernseher gekauft und dann für Jahre oder gar Jahrzehnte einfach benutzt. Es gab ja wenig technischen Fortschritt. Zum Glück sind diese Zeiten vorbei, neue Geräte kommen im Abstand weniger Monate mit einer besseren Funktionalität (z.B. SD -> HD -> 4k -> 8k, HDMI 2.x, OLDED) und sollten dabei normalerweise auch den Energieverbrauch optimieren. Smart TVs haben ein Betriebssystem wie jeder andere Computer auch, und dieses wird ständig aktualisiert. Damit sichert man sich seinen Fernseher ab, bekommt neue Features, neue Apps oder kleinere Verbesserungen.

Mein Sony TV ist ein KD-55XE8096. Ein Smart TV mit Android. Für dieses Modell bietet Sony ein Update des Betriebssystems an. Damit kommt Alexa, Android 8 und Verbesserungen bei der HDMI Wiedergabe – Ton, Kanal Umschalten.

In der Theorie sollte die Aktualisierung automatisch erfolgen. Sony stellt eine neue Android Version bereit, der TV lädt sich diese runter und dann kann diese installiert werden. Sollte, hätte, könnte, würde. Macht aber nicht. Zuerst veröffentlichte Sony das Update auf Android 8, dann wurde es wegen Problemen zurückgerufen und machte es später wieder verfügbar. Mein TV wird unterstützt, aber es wird keine neue Version gefunden. Weder automatisch im Hintergrund, noch bei direkter Aufforderung. Die neue Version für Android TV wird nicht gefunden.

Noch ist man nicht komplett auf den Willen des Fernsehers sich zu aktualisieren angewiesen. Man kann / darf das Update auch manuell anstoßen und durchführen. Dafür stellt Sony eine Anleitung online bereit. Diese Anleitung ist einfach und verständlich. Update herunterladen, auf USB Stick kopieren, beim TV einstecken, starten und warten. Beten hilft, denn sollte beim Update was nicht klappen, hat man mit großer Wahrscheinlichkeit für eine Weile einen nicht funktionsfähigen Fernseher, wenn nicht sogar Elektroschrott.

No risk, no fun. Es war klar: ein Update werde ich machen. Eine Datei herunterladen, auf einen USB Stick kopieren und dann warten: das kann ich. Ein kleines Problem: der USB Stick. Und das MacBook Pro. Der USB Stick muss so formatiert sein das der Sony TV die Daten lesen kann. Den Adapter für USB-C auf USB Type A hat man als Mac Benutzer natürlich zur Hand. USB Stick auch. Formatiert wird der USB Stick über das Festplattendienstprogramm.

Damit der Fernseher die Daten lesen kann, ist als Format ExFAT und als Schema MBR zu nehmen. GUID funktionierte nicht, hier wollte der Fernseher den Stick formatieren.

Danach die Update-Datei (sony…255.pkg) kopieren und nachdem der Fernseher den USB Stick erkannt und die Installationsdatei gefunden hat, startet das Update.

Android TV startet und lädt die einzelnen Apps.

Nach einer Weile ist dann Android TV einsatzbereit und der Fernseher ist auf dem neuesten Stand.

Let the world know

OpenID Connect with Keycloak

This blog shows how to use Keycloak for OAuth 2.0 and OpenID Connect. Keycloak is an identity and access management solution. Among its list of supported authentication mechanisms are SAML 2.0 and OpenID Connect. It is open source and can be installed via Docker. I wrote how to install Keycloak via Docker in a separate blog. The content of this blog was created as a side effect of configuring NetWeaver ABAP with Keycloak for SAML 2.0 and OAuth 2.0.

Here I will detail the steps to create an OAuth client in Keycloak, assign an OAuth 2.0 scope to it and how to get the OpenID Connect tokens for the client. For a better readability the steps are available as independent blogs / articles.

  1. Create OAuth client in Keycloak
  2. Create OAuth scope
  3. Add OAuth scope to client
  4. Get OpenID Connect tokens
Let the world know

Get OpenID Connect tokens from Keycloak

After creating an OAuth 2.0 scope and client and assigning the scope to the client, we can test the configuration. To do this, we need to log on in Keycloak as the OAuth 2.0 client. Keycloak will then validate the client and provide the Access Tokens and the scope(s) assigned to the client.

I will use Postman to test the setup. The Postman requests can be found in my GitLab repository. The request is as following:

  • Type: POST
  • URL: http://localhost:8080/auth/realms/master/protocol/openid-connect/token
  • Header: Content-Type application/x-www-form-urlencoded
  • Body: grant_type=client_credentials&client_id=oidclient&client_secret=7bc40a29-3eba-4c01-a9f1-9ebbb2eb8e9c

To authenticate, you need to send the client_id and client secret. These are the same values as for the client in Keycloak.

client_id: oidclient
client_secret: 7bc40a29-3eba-4c01-a9f1-9ebbb2eb8e9c

The parameter grant_type informs Keycloak about the authentification type we want. Client_credentials means that we send the client secret, and together with the client id this authenticates the client. Make sure to protect the client secret! This also explains why HTTPS is a minimum requirement.

grant_type: client_credentials

Result

Keycloak returns the JWT, including the access and refresh token as well as the scope. The assigned scope ZDEMO_CDS_SALESORDERITEM_CDS_0001 is included, allowing the client to access resources that are assigned to that scope.

{
   "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIyeFlIOWNnTThaSzl2Rm1nSEN3QzFiMlRWQzdCZGNldWIyTjB0SGRjU3dZIn0.eyJqdGkiOiIzODM1ODk0My1jMDRmLTRhMTktOTVkMS0wMjY5YTYwNGUyYmUiLCJleHAiOjE1NzQzNDAwNDIsIm5iZiI6MCwiaWF0IjoxNTc0MzM2NDQyLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMvbWFzdGVyIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6IjBlMmQxMGIyLTQwOTMtNGUzNi1iMjJiLTQ0MTg4MTE5NjVjOCIsInR5cCI6IkJlYXJlciIsImF6cCI6Im9pZGNsaWVudCIsImF1dGhfdGltZSI6MCwic2Vzc2lvbl9zdGF0ZSI6Ijc2Y2QxOTY1LTFhYjgtNDM1ZC05NThiLWNiNDQxOGM1OWIwOCIsImFjciI6IjEiLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoiWkRFTU9fQ0RTX1NBTEVTT1JERVJJVEVNX0NEU18wMDAxIHByb2ZpbGUgZW1haWwiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImNsaWVudEhvc3QiOiIxNzIuMTcuMC4xIiwiY2xpZW50SWQiOiJvaWRjbGllbnQiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJzZXJ2aWNlLWFjY291bnQtb2lkY2xpZW50IiwiY2xpZW50QWRkcmVzcyI6IjE3Mi4xNy4wLjEiLCJlbWFpbCI6InNlcnZpY2UtYWNjb3VudC1vaWRjbGllbnRAcGxhY2Vob2xkZXIub3JnIn0.CTrO-XuNM0pxa3xrJNZqGTkPzd88_AcvVKtbG7dy6cMwg_n8f1P2k2afoQMG-sN6JQzQ-Ei_0OIGkXrV6TGWLZqBI3Tgu3NKDoLMWu1PS7N9YA1ubXJN_277L91usWzqmaE_9o5Q6ubenh319tyBL5JUqe5veEfv5WabzwsbPqbx7BfiTf3iE0_xEyWrdXCT64s60hGRSUZqC8Pgz2qLKArfDF_Bs_w20R7Cr50qHx3WJQNO-w_X2DiufmgKD5Cb8Ue8TlpA9o5F88ZKzce-GVplJKY8d35Wjr07DuDTVFQzSWsBSM0Oi0FKuBYGy4mfXjcz8g0tKtcplf2UFurqmA",
    "expires_in": 3600,
    "refresh_expires_in": 1800,
   "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJmZmI5NDQ5ZS02MGIxLTQyZTMtYmEwYy1iNjQ0NDc0MjZiNDQifQ.eyJqdGkiOiJkMDc2Yzk3NS04ODA0LTRhNDUtODE3NS1jMmYxZDJjYzExZjIiLCJleHAiOjE1NzQzMzgyNDIsIm5iZiI6MCwiaWF0IjoxNTc0MzM2NDQyLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMvbWFzdGVyIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F1dGgvcmVhbG1zL21hc3RlciIsInN1YiI6IjBlMmQxMGIyLTQwOTMtNGUzNi1iMjJiLTQ0MTg4MTE5NjVjOCIsInR5cCI6IlJlZnJlc2giLCJhenAiOiJvaWRjbGllbnQiLCJhdXRoX3RpbWUiOjAsInNlc3Npb25fc3RhdGUiOiI3NmNkMTk2NS0xYWI4LTQzNWQtOTU4Yi1jYjQ0MThjNTliMDgiLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoiWkRFTU9fQ0RTX1NBTEVTT1JERVJJVEVNX0NEU18wMDAxIHByb2ZpbGUgZW1haWwifQ.blSzmr6gHXIhHY2ikAEXDiBfVQ17eVJsiWFdly8Krkk",
    "token_type": "bearer",
    "not-before-policy": 0,
    "session_state": "76cd1965-1ab8-435d-958b-cb4418c59b08",
    "scope": "ZDEMO_CDS_SALESORDERITEM_CDS_0001 profile email"
}

The content is encoded. Using a site like jwt.io, the content of the tokens can be decoded. For the access token:

{
	"jti": "38358943-c04f-4a19-95d1-0269a604e2be",
	"exp": 1574240042,
	"nbf": 0,
	"iat": 1574136442,
	"iss": "http://localhost:8080/auth/realms/master",
	"aud": "account",
	"sub": "0e2d10b2-4093-4e36-b22b-4418811965c8",
	"typ": "Bearer",
	"azp": "oidclient",
	"auth_time": 0,
	"session_state": "76cd1965-1ab8-435d-958b-cb4418c59b08",
	"acr": "1",
	"realm_access": {
		"roles": [
			"offline_access",
			"uma_authorization"
		]
	},
	"resource_access": {
		"account": {
			"roles": [
				"manage-account",
				"manage-account-links",
				"view-profile"
			]
		}
	},
	"scope": "ZDEMO_CDS_SALESORDERITEM_CDS_0001 profile email",
	"email_verified": false,
	"clientHost": "168.192.0.1",
	"clientId": "oidclient",
	"preferred_username": "service-account-oidclient",
	"clientAddress": "172.17.0.1",
	"email": "service-account-oidclient@placeholder.org"
}
Let the world know

Initial setup of profile generator in NW ABAP 7.5x Developer Edition

After installing NW ABAP 7.52 Developer Edition, you can run transaction PFCG and add new roles and authorizations. As the system is new, you first need to run transaction SU25 before you can create a new role and add authorizations to it.

Starting Profile Generator in PFCG for the first time will show a message.

Initially fill Profile Generator customer tables

Tx: SU25

Confirm that you know how to read SAP Notes.

The transaction shows a list of actions you can perform. As the system is a new one, do as the info message text stated: run action (1).

Click on Initially Fill the Customer Tables (1)

As the developer edition it is a standard SAP system, checking only the first item is enough.

The program is running and doing the needful.

After the loading finishes, a result screen is shown.

After executing the above steps, you can go back to profile generator and add new roles and authorizations.

Let the world know

Add OAuth 2.0 scope to client in Keycloak

After performing the previous steps in Keycloak, an OAuth 2.0 scope and client is available. To get the scope after the OAuth 2.0 client authenticates against Keycloak, you need to assign the scope to the client.

Log on to Keycloak and go to clients and select oidclient. This is the client created earlier.

Go to tab “Client Scopes”

Assign the previously created scope to the client.

Result

The scope is assigned to the client. Now the client can authenticate and Keycloak will issue the OIDC tokens and include the given scope.

Let the world know