@@ -25,50 +25,65 @@ internal final class UID2Client {
2525
2626 func refreshIdentity( refreshToken: String , refreshResponseKey: String ) async throws -> RefreshAPIPackage {
2727
28- var components = URLComponents ( string: uid2APIURL)
29- components? . path = " /v2/token/refresh "
30-
31- guard let urlPath = components? . url? . absoluteString,
32- let url = URL ( string: urlPath) else {
33- throw UID2Error . urlGeneration
34- }
35-
36- var request = URLRequest ( url: url)
37- request. httpMethod = " POST "
38- request. addValue ( clientVersion, forHTTPHeaderField: " X-UID2-Client-Version " )
39- request. addValue ( " application/x-www-form-urlencoded " , forHTTPHeaderField: " Content-Type " )
40- request. httpBody = refreshToken. data ( using: . utf8)
41-
42- let dataResponse = try await session. loadData ( for: request)
43- let data = dataResponse. 0
44- let statusCode = dataResponse. 1
45-
46- let decoder = JSONDecoder ( )
47- decoder. keyDecodingStrategy = . convertFromSnakeCase
48-
49- // Only Decrypt If HTTP Status is 200 (Success or Opt Out)
50- if statusCode != 200 {
51- do {
52- let tokenResponse = try decoder. decode ( RefreshTokenResponse . self, from: data)
53- throw UID2Error . refreshTokenServer ( status: tokenResponse. status, message: tokenResponse. message)
54- } catch {
55- throw UID2Error . refreshTokenServerDecoding ( httpStatus: statusCode, message: error. localizedDescription)
56- }
57- }
58-
59- // Decrypt Data Envelop
60- // https://github.com/UnifiedID2/uid2docs/blob/main/api/v2/encryption-decryption.md
61- guard let payloadData = DataEnvelope . decrypt ( refreshResponseKey, data, true ) else {
62- throw UID2Error . decryptPayloadData
63- }
64-
65- let tokenResponse = try decoder. decode ( RefreshTokenResponse . self, from: payloadData)
66-
67- guard let refreshAPIPackage = tokenResponse. toRefreshAPIPackage ( ) else {
68- throw UID2Error . refreshResponseToRefreshAPIPackage
28+ let request = Request . refresh ( token: refreshToken)
29+ let ( data, statusCode) = try await execute ( request)
30+
31+ let decoder = JSONDecoder ( )
32+ decoder. keyDecodingStrategy = . convertFromSnakeCase
33+
34+ // Only Decrypt If HTTP Status is 200 (Success or Opt Out)
35+ if statusCode != 200 {
36+ do {
37+ let tokenResponse = try decoder. decode ( RefreshTokenResponse . self, from: data)
38+ throw UID2Error . refreshTokenServer ( status: tokenResponse. status, message: tokenResponse. message)
39+ } catch {
40+ throw UID2Error . refreshTokenServerDecoding ( httpStatus: statusCode, message: error. localizedDescription)
6941 }
70-
71- return refreshAPIPackage
7242 }
7343
44+ // Decrypt Data Envelop
45+ // https://github.com/UnifiedID2/uid2docs/blob/main/api/v2/encryption-decryption.md
46+ guard let payloadData = DataEnvelope . decrypt ( refreshResponseKey, data, true ) else {
47+ throw UID2Error . decryptPayloadData
48+ }
49+
50+ let tokenResponse = try decoder. decode ( RefreshTokenResponse . self, from: payloadData)
51+
52+ guard let refreshAPIPackage = tokenResponse. toRefreshAPIPackage ( ) else {
53+ throw UID2Error . refreshResponseToRefreshAPIPackage
54+ }
55+
56+ return refreshAPIPackage
57+ }
58+
59+ // MARK: - Request Execution
60+
61+ internal func urlRequest(
62+ _ request: Request ,
63+ baseURL: URL
64+ ) -> URLRequest {
65+ var urlComponents = URLComponents ( url: baseURL, resolvingAgainstBaseURL: true ) !
66+ urlComponents. path = request. path
67+ urlComponents. queryItems = request. queryItems. isEmpty ? nil : request. queryItems
68+
69+ var urlRequest = URLRequest ( url: urlComponents. url!)
70+ urlRequest. httpMethod = request. method. rawValue
71+ if request. method == . post {
72+ urlRequest. httpBody = request. body
73+ }
74+
75+ request. headers. forEach { field, value in
76+ urlRequest. addValue ( value, forHTTPHeaderField: field)
77+ }
78+ urlRequest. addValue ( clientVersion, forHTTPHeaderField: " X-UID2-Client-Version " )
79+ return urlRequest
80+ }
81+
82+ private func execute( _ request: Request ) async throws -> ( Data , Int ) {
83+ let urlRequest = urlRequest (
84+ request,
85+ baseURL: URL ( string: uid2APIURL) !
86+ )
87+ return try await session. loadData ( for: urlRequest)
88+ }
7489}
0 commit comments