Python API
MFA
- class RPA.MFA.MFA(vault_name: Optional[str] = None, vault_key: Optional[str] = None, mode: Optional[OTPMode] = OTPMode.TIME)
RPA.MFA is a library intended mainly for generating one-time passwords (OTP) and not only, as OAuth2 support was introduced lately.
Library requires at the minimum rpaframework version 19.4.0.
Based on the pyotp and requests_oauthlib packages. It provides support for both MFA with the
* OTP
related keywords and OAuth2 “Authorization Code Flow” with the* OAuth *
related keywords.In the below example the mfa secret we are reading from the Robocorp Vault is the passcode generated by the Authenticator service. The passcode value is stored into the Vault with key otpsecret.
Passcode is typically a long string (16-32 characters), which is provided in a form of QR image, but it can be obtained by requesting access to a string.
Note that same code can be used to add a mobile phone as a duplicate authentication device at the same time when the same code is added into the Vault.
Robot framework example usage:
*** Settings *** Library RPA.MFA Library RPA.Robocorp.Vault *** Tasks *** Generate time based code ${secrets}= Get Secret mfa ${code}= Get Time Based OTP ${secrets}[otpsecret]
Python example usage
from RPA.MFA import MFA from RPA.Robocorp.Vault import Vault def main(): secrets = Vault().get_secret("mfa") code = MFA().get_time_based_otp(secrets["otpsecret"])
- ROBOT_LIBRARY_DOC_FORMAT = 'REST'
- ROBOT_LIBRARY_SCOPE = 'GLOBAL'
- generate_oauth_url(auth_url: str, *, client_id: str, redirect_uri: str, scope: str, **kwargs) str
Generates an authorization URL which must be opened by the user to start the OAuth2 flow and obtain an authorization code as response.
The received response URL should be passed further with
Get OAuth Token
in order to complete the flow. Arbitrary keyword arguments can be passed to the keyword, which will be redirected to the wrapped oauthlib library method call.- Parameters
auth_url – Authorization endpoint to call the request on. (https URL usually ending with ‘/authorize’)
client_id – Client app ID. (generated by the provider)
redirect_uri – Redirect URL allowed by the Client app configuration. ( necessary for getting the code response)
scope – Space-separated string of permissions. (accepted during the consent screen)
- Returns
Authorization URL string not containing any sensitive info in it. (call it with access_type=”offline” or set the right scope in the authorization URL for ensuring the existence of the refresh token)
Example: Robot Framework
*** Tasks *** Start OAuth Flow ${auth_url} = Generate OAuth URL ... https://accounts.google.com/o/oauth2/auth ... client_id=810482312368-19htmcgcj*******googleusercontent.com ... redirect_uri=https://developers.google.com/oauthplayground ... scope=https://mail.google.com ... access_type=offline prompt=consent # explicit grant Log Start OAuth2 flow: ${auth_url}
Example: Python
from RPA.MFA import MFA lib_mfa = MFA() auth_url = lib_mfa.generate_oauth_url( "https://accounts.google.com/o/oauth2/auth", ... ) print(f"Start OAuth2 flow: {auth_url}")
- get_counter_based_otp(counter: int, otp_passcode: Optional[str] = None)
Get counter based one time password using separately set passcode or by parameter otp_passcode. The counter index is given by the counter parameter.
- Parameters
counter – the index of the counter
otp_passcode – the passcode provided by the Authenticator
- get_oauth_token(token_url: str, *, client_secret: str, response_url: str, **kwargs) dict
Exchanges the code obtained previously with
Generate OAuth URL
for a token.The refresh token from the returned dictionary can be used further with the
Refresh OAuth Token
keyword in order to obtain a new access token when the previous one expires. (usually after one hour) Arbitrary keyword arguments can be passed to the keyword, which will be redirected to the wrapped oauthlib library method call.- Parameters
token_url – Token endpoint used with a POST request in order to retrieve the token data. (https URL usually ending with ‘/token’)
client_secret – Client app secret. (generated by the provider)
response_url – The final URL containing the authorization code found in the address bar after authenticating and authorizing the Client app through the authorization URL.
- Returns
A dictionary containing the access token, metadata and optionally the refresh token.
Example: Robot Framework
*** Tasks *** Finish OAuth Flow ${token} = Get OAuth Token ... https://accounts.google.com/o/oauth2/token ... client_secret=GOCSPX-******mqZAW89 ... response_url=${resp_url} # redirect of `Generate OAuth URL`
Example: Python
from RPA.MFA import MFA lib_mfa = MFA() lib_mfa.get_oauth_token("https://accounts.google.com/o/oauth2/token", ...)
- get_time_based_otp(otp_passcode: Optional[str] = None)
Get time based one time password using separately set passcode or by parameter otp_passcode.
- Parameters
otp_passcode – the passcode provided by the Authenticator
- property oauth: OAuth2Session
Raises if there’s no OAuth2 session already created.
- refresh_oauth_token(token_url: str, *, client_id: Optional[str] = None, client_secret: str, refresh_token: Optional[str] = None, **kwargs) dict
Refreshes the token as the access one usually expires after 1h and the refresh one never expires. (as long as it doesn’t get revoked)
The effect of this keyword is similar to
Get OAuth Token
, but this time you refresh unattended an already existing token by receiving a new one instead. Arbitrary keyword arguments can be passed to the keyword, which will be redirected to the wrapped oauthlib library method call.- Parameters
token_url – Token endpoint used with a POST request in order to refresh the token data. (https URL usually ending with ‘/token’)
client_id – Client app ID. (generated by the provider)
client_secret – Client app secret. (generated by the provider)
refresh_token – Refresh token string found in the dictionary obtained with
Get OAuth Token
orRefresh OAuth Token
.
- Returns
A token dictionary containing a new access token and updated metadata. (the refresh token inside isn’t guaranteed to remain constant)
Example: Robot Framework
*** Tasks *** Refresh OAuth Flow ${token} = Refresh OAuth Token ... https://accounts.google.com/o/oauth2/token ... client_id=810482312368-19htmcgcj*******googleusercontent.com ... client_secret=GOCSPX-******mqZAW89 ... refresh_token=${token}[refresh_token] # from `Get OAuth Token`
Example: Python
from RPA.MFA import MFA lib_mfa = MFA() lib_mfa.refresh_oauth_token( "https://accounts.google.com/o/oauth2/token", ... )
- set_counter_based_otp(otp_passcode: str)
Set counter based OTP with passcode.
- Parameters
otp_passcode – the passcode provided by the Authenticator
- set_time_based_otp(otp_passcode: str)
Set time based OTP with passcode.
- Parameters
otp_passcode – the passcode provided by the Authenticator
- use_mfa_secret_from_vault(vault_name: str, vault_key: str, mode: OTPMode = OTPMode.TIME)
Set time or counter based OTP with passcode stored in the Robocorp Vault named with vault_name under key of vault_key.
- Parameters
vault_name – name of the vault storing the passcode
vault_key – name of the vault key storing the passcode value