diff --git a/all.sas b/all.sas
index 74ed5b0..3f0f35a 100644
--- a/all.sas
+++ b/all.sas
@@ -23136,10 +23136,10 @@ run;
%mend mv_jobwaitfor;/**
@file mv_registerclient.sas
@brief Register Client and Secret (admin task)
- @details When building apps on SAS Viya, an client id and secret are sometimes
- required. In order to generate them, filesystem access to the Consul Token
- is needed (it is not enough to be in the SASAdministrator group in SAS
- Environment Manager).
+ @details When building apps on SAS Viya, a client id and secret are usually
+ required. In order to generate them, the Consul Token is required. To access
+ this token, you need to be a system administrator (it is not enough to be in
+ the SASAdministrator group in SAS Environment Manager).
If you are registering a lot of clients / secrets, you may find it more
convenient to use the [Viya Token Generator]
@@ -23160,51 +23160,56 @@ run;
"https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc;
+ %* generate random client using consul token as input parameter;
+ %mv_registerclient(consul_token=12x34sa43v2345n234lasd)
+
+ %* generate random client details with all scopes;
+ %mv_registerclient(scopes=openid *)
+
%* specific client with just openid scope;
%mv_registerclient(client_id=YourClient
,client_secret=YourSecret
,scopes=openid
)
- %* generate random client details with all scopes;
- %mv_registerclient(scopes=openid *)
-
%* generate random client with 90/180 second access/refresh token expiry;
%mv_registerclient(scopes=openid *
,access_token_validity=90
,refresh_token_validity=180
)
- @param client_id= The client name. Auto generated if blank.
- @param client_secret= Client secret. Auto generated if client is blank.
- @param scopes=(openid) List of space-seperated unquoted scopes
- @param grant_type=(authorization_code|refresh_token) Valid values are
- "password" or "authorization_code" (unquoted)
- @param outds=(mv_registerclient) The dataset to contain the registered client
- id and secret
- @param access_token_validity=(DEFAULT) The duration of validity of the access
- token in seconds. A value of DEFAULT will omit the entry (and use system
- default)
- @param refresh_token_validity=(DEFAULT) The duration of validity of the
+ @param [in,out] client_id= The client name. Auto generated if blank.
+ @param [in,out] client_secret= Client secret. Auto generated if client is
+ blank.
+ @param [in] consul_token= (0) Provide the actual consul token value here if
+ using Viya 4 or above.
+ @param [in] scopes= (openid) List of space-seperated unquoted scopes
+ @param [in] grant_type= (authorization_code|refresh_token) Valid values are
+ "password" or "authorization_code" (unquoted). Pipe seperated.
+ @param [out] outds=(mv_registerclient) The dataset to contain the registered
+ client id and secret
+ @param [in] access_token_validity= (DEFAULT) The access token duration in
+ seconds. A value of DEFAULT will omit the entry (and use system default)
+ @param [in] refresh_token_validity= (DEFAULT) The duration of validity of the
refresh token in seconds. A value of DEFAULT will omit the entry (and use
system default)
- @param name= An optional, human readable name for the client
- @param required_user_groups= A list of group names. If a user does not belong
- to all the required groups, the user will not be authenticated and no tokens
- are issued to this client for that user. If this field is not specified,
- authentication and token issuance proceeds normally.
- @param autoapprove= During the auth step the user can choose which scope to
- apply. Setting this to true will autoapprove all the client scopes.
- @param use_session= If true, access tokens issued to this client will be
+ @param [in] client_name= (DEFAULT) An optional, human readable name for the
+ client.
+ @param [in] required_user_groups= A list of group names. If a user does not
+ belong to all the required groups, the user will not be authenticated and no
+ tokens are issued to this client for that user. If this field is not
+ specified, authentication and token issuance proceeds normally.
+ @param [in] autoapprove= During the auth step the user can choose which scope
+ to apply. Setting this to true will autoapprove all the client scopes.
+ @param [in] use_session= If true, access tokens issued to this client will be
associated with an HTTP session and revoked upon logout or time-out.
- @param outjson= (_null_) A dataset containing the lines of JSON submitted.
- Useful for debugging.
+ @param [out] outjson= (_null_) A dataset containing the lines of JSON
+ submitted. Useful for debugging.
@version VIYA V.03.04
@author Allan Bowe, source: https://github.com/sasjs/core
SAS Macros
- @li mp_abort.sas
@li mf_getplatform.sas
@li mf_getuniquefileref.sas
@li mf_getuniquelibref.sas
@@ -23216,6 +23221,7 @@ run;
%macro mv_registerclient(client_id=
,client_secret=
+ ,consul_token=0
,client_name=DEFAULT
,scopes=openid
,grant_type=authorization_code|refresh_token
@@ -23227,33 +23233,40 @@ run;
,refresh_token_validity=DEFAULT
,outjson=_null_
);
-%local consul_token fname1 fname2 fname3 libref access_token url tokloc;
+%local fname1 fname2 fname3 libref access_token url tokloc;
%if client_name=DEFAULT %then %let client_name=
- Generated by %mf_getuser() on %sysfunc(datetime(),datetime19.) using SASjs;
+ Generated by %mf_getuser() (&sysuserid) on %sysfunc(datetime(),datetime19.
+ ) using SASjs;
options noquotelenmax;
-/* first, get consul token needed to get client id / secret */
-%let tokloc=/etc/SASSecurityCertificateFramework/tokens/consul/default;
-%let tokloc=%mf_loc(VIYACONFIG)&tokloc/client.token;
+%if "&consul_token"="0" %then %do;
+ /* first, get consul token needed to get client id / secret */
+ %let tokloc=/etc/SASSecurityCertificateFramework/tokens/consul/default;
+ %let tokloc=%mf_loc(VIYACONFIG)&tokloc/client.token;
-%mp_abort(iftrue=(%sysfunc(fileexist(&tokloc))=0)
- ,mac=&sysmacroname
- ,msg=%str(Unable to access the consul token at &tokloc)
-)
+ %if %sysfunc(fileexist(&tokloc))=0 %then %do;
+ %put &sysmacroname: unable to access the consul token at &tokloc;
+ %put Try passing the value in the consul= macro parameter;
+ %put See docs: https://core.sasjs.io/mv__registerclient_8sas.html;
+ %abort;
+ %end;
-%let consul_token=0;
-data _null_;
- infile "&tokloc";
- input token:$64.;
- call symputx('consul_token',token);
-run;
+ data _null_;
+ infile "&tokloc";
+ input token:$64.;
+ call symputx('consul_token',token);
+ run;
-%mp_abort(iftrue=("&consul_token"="0")
- ,mac=&sysmacroname
- ,msg=%str(Unable to source the consul token from &tokloc)
-)
+ %if "&consul_token"="0" %then %do;
+ %put &sysmacroname: Unable to source the consul token from &tokloc;
+ %put It seems your account (&sysuserid) does not have admin rights;
+ %put Please speak with your platform adminstrator;
+ %put Docs: https://core.sasjs.io/mv__registerclient_8sas.html;
+ %abort;
+ %end;
+%end;
%local base_uri; /* location of rest apis */
%let base_uri=%mf_getplatform(VIYARESTAPI);
@@ -23266,6 +23279,9 @@ proc http method='POST' out=&fname1
headers "X-Consul-Token"="&consul_token";
run;
+%put &=SYS_PROCHTTP_STATUS_CODE;
+%put &=SYS_PROCHTTP_STATUS_PHRASE;
+
%let libref=%mf_getuniquelibref();
libname &libref JSON fileref=&fname1;
diff --git a/viya/mv_registerclient.sas b/viya/mv_registerclient.sas
index b248a57..509dae0 100644
--- a/viya/mv_registerclient.sas
+++ b/viya/mv_registerclient.sas
@@ -1,10 +1,10 @@
/**
@file mv_registerclient.sas
@brief Register Client and Secret (admin task)
- @details When building apps on SAS Viya, an client id and secret are sometimes
- required. In order to generate them, filesystem access to the Consul Token
- is needed (it is not enough to be in the SASAdministrator group in SAS
- Environment Manager).
+ @details When building apps on SAS Viya, a client id and secret are usually
+ required. In order to generate them, the Consul Token is required. To access
+ this token, you need to be a system administrator (it is not enough to be in
+ the SASAdministrator group in SAS Environment Manager).
If you are registering a lot of clients / secrets, you may find it more
convenient to use the [Viya Token Generator]
@@ -25,51 +25,56 @@
"https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc;
+ %* generate random client using consul token as input parameter;
+ %mv_registerclient(consul_token=12x34sa43v2345n234lasd)
+
+ %* generate random client details with all scopes;
+ %mv_registerclient(scopes=openid *)
+
%* specific client with just openid scope;
%mv_registerclient(client_id=YourClient
,client_secret=YourSecret
,scopes=openid
)
- %* generate random client details with all scopes;
- %mv_registerclient(scopes=openid *)
-
%* generate random client with 90/180 second access/refresh token expiry;
%mv_registerclient(scopes=openid *
,access_token_validity=90
,refresh_token_validity=180
)
- @param client_id= The client name. Auto generated if blank.
- @param client_secret= Client secret. Auto generated if client is blank.
- @param scopes=(openid) List of space-seperated unquoted scopes
- @param grant_type=(authorization_code|refresh_token) Valid values are
- "password" or "authorization_code" (unquoted)
- @param outds=(mv_registerclient) The dataset to contain the registered client
- id and secret
- @param access_token_validity=(DEFAULT) The duration of validity of the access
- token in seconds. A value of DEFAULT will omit the entry (and use system
- default)
- @param refresh_token_validity=(DEFAULT) The duration of validity of the
+ @param [in,out] client_id= The client name. Auto generated if blank.
+ @param [in,out] client_secret= Client secret. Auto generated if client is
+ blank.
+ @param [in] consul_token= (0) Provide the actual consul token value here if
+ using Viya 4 or above.
+ @param [in] scopes= (openid) List of space-seperated unquoted scopes
+ @param [in] grant_type= (authorization_code|refresh_token) Valid values are
+ "password" or "authorization_code" (unquoted). Pipe seperated.
+ @param [out] outds=(mv_registerclient) The dataset to contain the registered
+ client id and secret
+ @param [in] access_token_validity= (DEFAULT) The access token duration in
+ seconds. A value of DEFAULT will omit the entry (and use system default)
+ @param [in] refresh_token_validity= (DEFAULT) The duration of validity of the
refresh token in seconds. A value of DEFAULT will omit the entry (and use
system default)
- @param name= An optional, human readable name for the client
- @param required_user_groups= A list of group names. If a user does not belong
- to all the required groups, the user will not be authenticated and no tokens
- are issued to this client for that user. If this field is not specified,
- authentication and token issuance proceeds normally.
- @param autoapprove= During the auth step the user can choose which scope to
- apply. Setting this to true will autoapprove all the client scopes.
- @param use_session= If true, access tokens issued to this client will be
+ @param [in] client_name= (DEFAULT) An optional, human readable name for the
+ client.
+ @param [in] required_user_groups= A list of group names. If a user does not
+ belong to all the required groups, the user will not be authenticated and no
+ tokens are issued to this client for that user. If this field is not
+ specified, authentication and token issuance proceeds normally.
+ @param [in] autoapprove= During the auth step the user can choose which scope
+ to apply. Setting this to true will autoapprove all the client scopes.
+ @param [in] use_session= If true, access tokens issued to this client will be
associated with an HTTP session and revoked upon logout or time-out.
- @param outjson= (_null_) A dataset containing the lines of JSON submitted.
- Useful for debugging.
+ @param [out] outjson= (_null_) A dataset containing the lines of JSON
+ submitted. Useful for debugging.
@version VIYA V.03.04
@author Allan Bowe, source: https://github.com/sasjs/core
SAS Macros
- @li mp_abort.sas
@li mf_getplatform.sas
@li mf_getuniquefileref.sas
@li mf_getuniquelibref.sas
@@ -81,6 +86,7 @@
%macro mv_registerclient(client_id=
,client_secret=
+ ,consul_token=0
,client_name=DEFAULT
,scopes=openid
,grant_type=authorization_code|refresh_token
@@ -92,33 +98,40 @@
,refresh_token_validity=DEFAULT
,outjson=_null_
);
-%local consul_token fname1 fname2 fname3 libref access_token url tokloc;
+%local fname1 fname2 fname3 libref access_token url tokloc;
%if client_name=DEFAULT %then %let client_name=
- Generated by %mf_getuser() on %sysfunc(datetime(),datetime19.) using SASjs;
+ Generated by %mf_getuser() (&sysuserid) on %sysfunc(datetime(),datetime19.
+ ) using SASjs;
options noquotelenmax;
-/* first, get consul token needed to get client id / secret */
-%let tokloc=/etc/SASSecurityCertificateFramework/tokens/consul/default;
-%let tokloc=%mf_loc(VIYACONFIG)&tokloc/client.token;
+%if "&consul_token"="0" %then %do;
+ /* first, get consul token needed to get client id / secret */
+ %let tokloc=/etc/SASSecurityCertificateFramework/tokens/consul/default;
+ %let tokloc=%mf_loc(VIYACONFIG)&tokloc/client.token;
-%mp_abort(iftrue=(%sysfunc(fileexist(&tokloc))=0)
- ,mac=&sysmacroname
- ,msg=%str(Unable to access the consul token at &tokloc)
-)
+ %if %sysfunc(fileexist(&tokloc))=0 %then %do;
+ %put &sysmacroname: unable to access the consul token at &tokloc;
+ %put Try passing the value in the consul= macro parameter;
+ %put See docs: https://core.sasjs.io/mv__registerclient_8sas.html;
+ %abort;
+ %end;
-%let consul_token=0;
-data _null_;
- infile "&tokloc";
- input token:$64.;
- call symputx('consul_token',token);
-run;
+ data _null_;
+ infile "&tokloc";
+ input token:$64.;
+ call symputx('consul_token',token);
+ run;
-%mp_abort(iftrue=("&consul_token"="0")
- ,mac=&sysmacroname
- ,msg=%str(Unable to source the consul token from &tokloc)
-)
+ %if "&consul_token"="0" %then %do;
+ %put &sysmacroname: Unable to source the consul token from &tokloc;
+ %put It seems your account (&sysuserid) does not have admin rights;
+ %put Please speak with your platform adminstrator;
+ %put Docs: https://core.sasjs.io/mv__registerclient_8sas.html;
+ %abort;
+ %end;
+%end;
%local base_uri; /* location of rest apis */
%let base_uri=%mf_getplatform(VIYARESTAPI);
@@ -131,6 +144,9 @@ proc http method='POST' out=&fname1
headers "X-Consul-Token"="&consul_token";
run;
+%put &=SYS_PROCHTTP_STATUS_CODE;
+%put &=SYS_PROCHTTP_STATUS_PHRASE;
+
%let libref=%mf_getuniquelibref();
libname &libref JSON fileref=&fname1;