/** @file mv_tokenrefresh.sas @brief Get an additional access token using a refresh token @details Before an access token can be obtained, a refresh token is required For that, check out the `mv_tokenauth` macro. Usage: * prep work - register client, get refresh token, save it for later use ; %mv_registerclient(outds=client) %mv_tokenauth(inds=client,code=wKDZYTEPK6) data _null_; file "~/refresh.token"; put "&refresh_token"; run; * now do the things n stuff; data _null_; infile "~/refresh.token"; input; call symputx('refresh_token',_infile_); run; %mv_tokenrefresh(client_id=&client ,client_secret=&secret ) A great article for explaining all these steps is available here: https://blogs.sas.com/content/sgf/2019/01/25/authentication-to-sas-viya/ @param inds= A dataset containing client_id and client_secret @param outds= A dataset containing access_token and refresh_token @param client_id= The client name (alternative to inds) @param client_secret= client secret (alternative to inds) @param grant_type= valid values are "password" or "authorization_code" (unquoted). The default is authorization_code. @param user= If grant_type=password then provide the username here @param pass= If grant_type=password then provide the password here @param access_token_var= The global macro variable to contain the access token @param refresh_token_var= The global macro variable containing the refresh token @version VIYA V.03.04 @author Allan Bowe @source https://github.com/sasjs/core

Dependencies

@li mp_abort.sas @li mf_getplatform.sas @li mf_getuniquefileref.sas @li mf_getuniquelibref.sas @li mf_existds.sas **/ %macro mv_tokenrefresh(inds=mv_registerclient ,outds=mv_tokenrefresh ,client_id=someclient ,client_secret=somesecret ,grant_type=authorization_code ,user= ,pass= ,access_token_var=ACCESS_TOKEN ,refresh_token_var=REFRESH_TOKEN ); %global &access_token_var &refresh_token_var; options noquotelenmax; %local fref1 libref; /* test the validity of inputs */ %mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password) ,mac=&sysmacroname ,msg=%str(Invalid value for grant_type: &grant_type) ) %mp_abort(iftrue=(&grant_type=password and (%str(&user)=%str() or %str(&pass)=%str())) ,mac=&sysmacroname ,msg=%str(username / password required) ) %if %mf_existds(&inds) %then %do; data _null_; set &inds; call symputx('client_id',client_id,'l'); call symputx('client_secret',client_secret,'l'); call symputx("&refresh_token_var",&refresh_token_var,'l'); run; %end; %mp_abort(iftrue=(%str(&client_id)=%str() or %str(&client_secret)=%str()) ,mac=&sysmacroname ,msg=%str(client / secret must both be provided) ) /** * Request access token */ %local base_uri; /* location of rest apis */ %let base_uri=%mf_getplatform(VIYARESTAPI); %let fref1=%mf_getuniquefileref(); proc http method='POST' in="grant_type=refresh_token%nrstr(&)refresh_token=&&&refresh_token_var" out=&fref1 url="&base_uri/SASLogon/oauth/token" WEBUSERNAME="&client_id" WEBPASSWORD="&client_secret" AUTH_BASIC; headers "Accept"="application/json" "Content-Type"="application/x-www-form-urlencoded"; run; /*data _null_;infile &fref1;input;put _infile_;run;*/ /** * Extract access / refresh tokens */ %let libref=%mf_getuniquelibref(); libname &libref JSON fileref=&fref1; /* extract the token */ data &outds; set &libref..root; call symputx("&access_token_var",access_token); call symputx("&refresh_token_var",refresh_token); run; libname &libref clear; filename &fref1 clear; %mend;