mirror of
https://github.com/sasjs/core.git
synced 2025-12-10 14:04:36 +00:00
134 lines
3.8 KiB
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; |