generated from abapChaoLiu/abap_template
-
Notifications
You must be signed in to change notification settings - Fork 9
/
zcl_jwt_generator.clas.abap
190 lines (150 loc) · 5.55 KB
/
zcl_jwt_generator.clas.abap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
CLASS zcl_jwt_generator DEFINITION
PUBLIC
CREATE PUBLIC .
PUBLIC SECTION.
TYPES: BEGIN OF ty_jwt_header,
alg TYPE string,
END OF ty_jwt_header.
TYPES: BEGIN OF ty_jwt_claim,
iss TYPE string, "Issuer
sub TYPE string, "Subject
aud TYPE string, "Audience
exp TYPE string, "Expiration Time
nbf TYPE string, "Not Before
iat TYPE string, "Issued At
jti TYPE string, "JWT ID
END OF ty_jwt_claim.
METHODS generate_jwt
IMPORTING jwt_header TYPE ty_jwt_header
jwt_claim TYPE ty_jwt_claim
ssf_info TYPE ssfinfo
ssf_format TYPE ssfform DEFAULT 'PKCS1-V1.5'
ssf_hash_agrithm TYPE ssfhash DEFAULT 'SHA256'
RETURNING VALUE(jwt) TYPE string
RAISING zcx_jwt_generator.
METHODS base64url_encode
IMPORTING unencoded TYPE string
RETURNING VALUE(base64url) TYPE string.
PROTECTED SECTION.
PRIVATE SECTION.
TYPES:
ty_tssfbin TYPE STANDARD TABLE OF ssfbin WITH KEY table_line WITHOUT FURTHER SECONDARY KEYS.
METHODS string_to_binary_tab
IMPORTING input_string TYPE string
RETURNING VALUE(output_bins) TYPE ty_tssfbin
RAISING zcx_jwt_generator.
METHODS binary_tab_to_string
IMPORTING input_bins TYPE ty_tssfbin
length TYPE ssflen
RETURNING VALUE(output_string) TYPE string
RAISING zcx_jwt_generator.
ENDCLASS.
CLASS zcl_jwt_generator IMPLEMENTATION.
METHOD base64url_encode.
base64url = cl_http_utility=>encode_base64( unencoded = unencoded ).
REPLACE ALL OCCURRENCES OF '=' IN base64url WITH ''.
REPLACE ALL OCCURRENCES OF '+' IN base64url WITH '-'.
REPLACE ALL OCCURRENCES OF '/' IN base64url WITH '_'.
ENDMETHOD.
METHOD binary_tab_to_string.
CALL FUNCTION 'SCMS_BINARY_TO_STRING'
EXPORTING
input_length = length
encoding = '4110'
IMPORTING
text_buffer = output_string
TABLES
binary_tab = input_bins
EXCEPTIONS
failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE zcx_jwt_generator USING MESSAGE.
ENDIF.
ENDMETHOD.
METHOD generate_jwt.
DATA input_bins TYPE STANDARD TABLE OF ssfbin.
DATA output_bins TYPE STANDARD TABLE OF ssfbin.
DATA input_length TYPE ssflen.
DATA output_length TYPE ssflen.
DATA output_crc TYPE ssfreturn.
DATA signers TYPE STANDARD TABLE OF ssfinfo.
DATA: jwt_claim_json TYPE string,
jwt_header_json TYPE string,
jwt_header_base64url TYPE string,
jwt_claim_base64url TYPE string.
DATA input_base64url TYPE string.
DATA: signature TYPE string,
signature_base64url TYPE string.
jwt_header_json = /ui2/cl_json=>serialize(
compress = abap_true
data = jwt_header
pretty_name = /ui2/cl_json=>pretty_mode-low_case ).
jwt_claim_json = /ui2/cl_json=>serialize(
compress = abap_true
data = jwt_claim
pretty_name = /ui2/cl_json=>pretty_mode-low_case ).
jwt_header_base64url = base64url_encode( jwt_header_json ).
jwt_claim_base64url = base64url_encode( jwt_claim_json ).
input_base64url = |{ jwt_header_base64url }.{ jwt_claim_base64url }|.
input_length = strlen( input_base64url ).
input_bins = string_to_binary_tab( input_string = input_base64url ).
APPEND ssf_info TO signers.
CALL FUNCTION 'SSF_KRN_SIGN'
EXPORTING
str_format = ssf_format
b_inc_certs = abap_false
b_detached = abap_false
b_inenc = abap_false
ostr_input_data_l = input_length
str_hashalg = ssf_hash_agrithm
IMPORTING
ostr_signed_data_l = output_length
crc = output_crc " SSF Return code
TABLES
ostr_input_data = input_bins
signer = signers
ostr_signed_data = output_bins
EXCEPTIONS
ssf_krn_error = 1
ssf_krn_noop = 2
ssf_krn_nomemory = 3
ssf_krn_opinv = 4
ssf_krn_nossflib = 5
ssf_krn_signer_list_error = 6
ssf_krn_input_data_error = 7
ssf_krn_invalid_par = 8
ssf_krn_invalid_parlen = 9
ssf_fb_input_parameter_error = 10.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE zcx_jwt_generator USING MESSAGE.
ENDIF.
signature = binary_tab_to_string( input_bins = output_bins
length = output_length ).
signature_base64url = base64url_encode( signature ).
jwt = |{ input_base64url }.{ signature_base64url }|.
ENDMETHOD.
METHOD string_to_binary_tab.
DATA lv_xstring TYPE xstring.
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
text = input_string
encoding = '4110'
IMPORTING
buffer = lv_xstring
EXCEPTIONS
failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE zcx_jwt_generator USING MESSAGE.
ENDIF.
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = lv_xstring
TABLES
binary_tab = output_bins.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE zcx_jwt_generator USING MESSAGE.
ENDIF.
ENDMETHOD.
ENDCLASS.