1
0
mirror of https://github.com/sasjs/core.git synced 2025-12-10 14:04:36 +00:00
Files
core/viya/mv_tokenrefresh.sas

134 lines
3.8 KiB
SAS

/**
@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 [in] inds= A dataset containing client_id and client_secret
@param [in] outds= A dataset containing access_token and refresh_token
@param [in] client_id= The client name (alternative to inds)
@param [in] client_secret= client secret (alternative to inds)
@param [in] grant_type= valid values are "password" or "authorization_code"
(unquoted). The default is authorization_code.
@param [in] user= If grant_type=password then provide the username here
@param [in] pass= If grant_type=password then provide the password here
@param [in] access_token_var= (ACCESS_TOKEN)
The global macro variable to contain the access token
@param [in] refresh_token_var= (REFRESH_TOKEN)
The global macro variable containing the refresh token
@version VIYA V.03.04
@author Allan Bowe, source: https://github.com/sasjs/core
<h4> SAS Macros </h4>
@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 mv_tokenrefresh;