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
|
# 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 }
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 = create_new_session(session_params, auth_query.shop)
cookie = if Context.embedded?
SessionCookie.new(
value: "",
expires: Time.now,
)
else
SessionCookie.new(
value: session.id,
expires: session.online? ? session.expires : nil,
)
end
{ session: session, cookie: cookie }
end
|