{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Using OpenID Connect with MI Scripting Toolkit\n",
    "\n",
	"Please contact Ansys Granta Technical Support for information on supported OpenID Connect Identity Providers, and for configuration and setup documentation.\n",
    "\n",
    "## Access Granta MI using OpenID Connect\n",
    "\n",
    "In version 2.2 onwards of MI Scripting Toolkit, OIDC authentication is exposed through the Session class in the same way as other authentication options. For interactive use, this is as simple as setting `oidc=True` in the constructor."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from GRANTA_MIScriptingToolkit import granta as mpy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[<Database: MI Training, unit system: Database>]\n"
     ]
    }
   ],
   "source": [
    "# Connect to MI using OpenID Connect; this will open a browser and prompt the user to log in.\n",
    "# Access MI and list the available databases.\n",
    "s = mpy.Session(\"https://localhost/mi_servicelayer\", oidc=True)\n",
    "print(s.dbs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Unattended use\n",
    "For unattended use, OIDC tokens can be stored securely in the OS credential manager. For Windows this is the Windows\n",
    "Credential Locker, for linux this may be Freedesktop Secret Service or the dbus KWallet. Tokens can be persisted with\n",
    "the `Session.persist_oidc_token()` method."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "gaUDsgUrOiJSUzI1NiIsImtpZCI6IkVlMlQ0Y2F4U1RkaVFDTmEyMTcyUWciLCJ0eXAiOiJhdCtqd3QifQ.eyJuYmYiOjE1OTE3ODEwNzAsImV4cCI6MTU5MTc4MjI3MCwiaXNzIjoiaHR0cHM6Ly9taWF1dGgtaWRwLmdyYW50YWRlc2lnbi5sb2NhbDo1MDAwIiwiYXVkIjoibWkiLCJjbGllbnRfaWQiOiJtaUNsaWVudCIsInN1YiI6Ik1JX1VTRVJfNyIsImF1dGhfdGltZSI6MTU5MTc4MTA2OSwiaWRwIjoibG9jYWwiLCJzY29wZSI6WyJvcGVuaWQiLCJwcm9maWxlIiwibWkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsicHdkIl19.D2PM4ofOZYDH-yQfo_2K1K33OpdmuhsEp3yt_p0wQeN8WmCBVrF4CFfWNlKUBbiQHlQlUUNEjze14Z-nkogpJafT37ltVzIxF0AEHfHsZpB4WwUMLPoDP3fvQ9cO3N66LuiKaD5LUhnalFZTiwZs4xCJhAMcWpYkaSNAEcR_TX-3do-iDmHqXqXbvqHa-2PACgh5k3nVl4sa92d69_OFzLEQA-vuBBzhMiM9aecK6M-2CBxPQn26rG8f1_L0siZC_qAhw0lKj-NTh6Eeyd-BqfpSEvBvUOCUDzoDGvK9e6e-PPwikOJKa4LtBUgt4mmfo9UaqLpraHp2nvp8v2J3LQ\n"
     ]
    }
   ],
   "source": [
    "# We can access the tokens provided by the OpenID identity provider using a private property of the session object.\n",
    "print(s._Session__auth_token)\n",
    "\n",
    "s.persist_oidc_token()\n",
    "\n",
    "# Clear the current Session\n",
    "del(s)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "OpenID Connect tokens can then be extracted from the store and used to create a new Session object with no user interaction."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "gaUDsgUrOiJSUzI1NiIsImtpZCI6IkVlMlQ0Y2F4U1RkaVFDTmEyMTcyUWciLCJ0eXAiOiJhdCtqd3QifQ.eyJuYmYiOjE1OTE3ODEwNzAsImV4cCI6MTU5MTc4MjI3MCwiaXNzIjoiaHR0cHM6Ly9taWF1dGgtaWRwLmdyYW50YWRlc2lnbi5sb2NhbDo1MDAwIiwiYXVkIjoibWkiLCJjbGllbnRfaWQiOiJtaUNsaWVudCIsInN1YiI6Ik1JX1VTRVJfNyIsImF1dGhfdGltZSI6MTU5MTc4MTA2OSwiaWRwIjoibG9jYWwiLCJzY29wZSI6WyJvcGVuaWQiLCJwcm9maWxlIiwibWkiLCJvZmZsaW5lX2FjY2VzcyJdLCJhbXIiOlsicHdkIl19.D2PM4ofOZYDH-yQfo_2K1K33OpdmuhsEp3yt_p0wQeN8WmCBVrF4CFfWNlKUBbiQHlQlUUNEjze14Z-nkogpJafT37ltVzIxF0AEHfHsZpB4WwUMLPoDP3fvQ9cO3N66LuiKaD5LUhnalFZTiwZs4xCJhAMcWpYkaSNAEcR_TX-3do-iDmHqXqXbvqHa-2PACgh5k3nVl4sa92d69_OFzLEQA-vuBBzhMiM9aecK6M-2CBxPQn26rG8f1_L0siZC_qAhw0lKj-NTh6Eeyd-BqfpSEvBvUOCUDzoDGvK9e6e-PPwikOJKa4LtBUgt4mmfo9UaqLpraHp2nvp8v2J3LQ\n",
      "[<Database: MI Training, unit system: Database>]\n"
     ]
    }
   ],
   "source": [
    "s = mpy.Session(\"https://localhost/mi_servicelayer\", oidc=True, use_stored_token=True)\n",
    "\n",
    "print(s._Session__auth_token)\n",
    "\n",
    "print(s.dbs)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
