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
|
# File 'lib/shopify_api/auth/oauth.rb', line 60
def validate_auth_callback(cookies:, auth_query:)
unless Context.setup?
raise Errors::ContextNotSetupError, "ShopifyAPI::Context not setup, please call ShopifyAPI::Context.setup"
end
raise Errors::InvalidOauthError, "Invalid OAuth callback." unless Utils::HmacValidator.validate(auth_query)
raise Errors::UnsupportedOauthError, "Cannot perform OAuth for private apps." if Context.private?
state = cookies[SessionCookie::SESSION_COOKIE_NAME]
raise Errors::NoSessionCookieError unless state
raise Errors::InvalidOauthError,
"Invalid state in OAuth callback." unless state == auth_query.state
null_session = Auth::Session.new(shop: auth_query.shop)
body = {
client_id: Context.api_key,
client_secret: Context.api_secret_key,
code: auth_query.code,
expiring: Context.expiring_offline_access_tokens ? 1 : 0,
}
client = Clients::HttpClient.new(session: null_session, base_path: "/admin/oauth")
response = begin
client.request(
Clients::HttpRequest.new(
http_method: :post,
path: "access_token",
body: body,
body_type: "application/json",
),
)
rescue ShopifyAPI::Errors::HttpResponseError => e
raise Errors::RequestAccessTokenError,
"Cannot complete OAuth process. Received a #{e.code} error while requesting access token."
end
session_params = T.cast(response.body, T::Hash[String, T.untyped]).to_h
session = Session.from(shop: auth_query.shop,
access_token_response: Oauth::AccessTokenResponse.from_hash(session_params))
cookie = if Context.embedded?
SessionCookie.new(
value: "",
expires: Time.now,
)
else
SessionCookie.new(
value: session.id,
expires: session.expires ? session.expires : nil,
)
end
{ session: session, cookie: cookie }
end
|