Skip to content

Commit 1b440b9

Browse files
committed
Add new SessionUtil method to retrieve session id from shopify ID token
1 parent c1163e0 commit 1b440b9

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

lib/shopify_api/utils/session_utils.rb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,23 @@ def current_session_id(auth_header, cookies, online)
4848
end
4949
end
5050

51+
sig do
52+
params(
53+
id_token: String,
54+
online: T::Boolean,
55+
).returns(String)
56+
end
57+
def session_id_from_shopify_id_token(id_token:, online:)
58+
payload = Auth::JwtPayload.new(id_token)
59+
shop = payload.shop
60+
61+
if online
62+
jwt_session_id(shop, payload.sub)
63+
else
64+
offline_session_id(shop)
65+
end
66+
end
67+
5168
sig { params(shop: String, user_id: String).returns(String) }
5269
def jwt_session_id(shop, user_id)
5370
"#{shop}_#{user_id}"

test/utils/session_utils_test.rb

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# typed: false
2+
# frozen_string_literal: true
3+
4+
require_relative "../test_helper"
5+
6+
module ShopifyAPITest
7+
module Utils
8+
class SessionUtils < Test::Unit::TestCase
9+
def setup
10+
super
11+
@user_id = "my_user_id"
12+
@shop = "test-shop.myshopify.io"
13+
14+
@jwt_payload = {
15+
iss: "https://#{@shop}/admin",
16+
dest: "https://#{@shop}",
17+
aud: ShopifyAPI::Context.api_key,
18+
sub: @user_id,
19+
exp: (Time.now + 10).to_i,
20+
nbf: 1234,
21+
iat: 1234,
22+
jti: "4321",
23+
sid: "abc123",
24+
}
25+
26+
@jwt_token = JWT.encode(@jwt_payload, ShopifyAPI::Context.api_secret_key, "HS256")
27+
end
28+
29+
def test_gets_online_session_id_from_shopify_id_token
30+
expected_session_id = "#{@shop}_#{@user_id}"
31+
assert_equal(
32+
expected_session_id,
33+
ShopifyAPI::Utils::SessionUtils.session_id_from_shopify_id_token(id_token: @jwt_token, online: true),
34+
)
35+
end
36+
37+
def test_gets_offline_session_id_from_shopify_id_token
38+
expected_session_id = "offline_#{@shop}"
39+
assert_equal(
40+
expected_session_id,
41+
ShopifyAPI::Utils::SessionUtils.session_id_from_shopify_id_token(id_token: @jwt_token, online: false),
42+
)
43+
end
44+
45+
def test_session_id_from_shopify_id_token_raises_invalid_jwt_errors
46+
assert_raises(ShopifyAPI::Errors::InvalidJwtTokenError) do
47+
ShopifyAPI::Utils::SessionUtils.session_id_from_shopify_id_token(id_token: "invalid_token", online: true)
48+
end
49+
end
50+
end
51+
end
52+
end

0 commit comments

Comments
 (0)