Вход в систему через API shopify API
Привет
API-интерфейс Shopify является новым для меня, поэтому я заранее прошу прощения, если на него уже был дан ответ. Я управляю магазином, а также хочу создать приложение на python и django, позволяющее пользователям подключаться через Twitter. Я уже подключил приложение к shopify (через партнера по shopify и магазин разработки). Я также знаю, как подключить учетную запись твиттера к моему приложению (используя для этого python). Теперь я пытаюсь интегрировать функцию автоматического входа в систему между магазином Shopify и моим приложением Django.
Приложение будет на www.myapp.com, а магазин shopify на www.shop.myapp.com. ; Как я могу убедиться, что пользователь вошел в систему во время посещения магазина shopify, если он подключается к моему приложению Django (через Twitter)? В этом случае каким должен быть пароль пользователя или я должен пригласить его создать пароль при входе в систему через Twitter?
Кто-нибудь пробовал нечто подобное с shopify?
Любая ориентация была бы отличной!
Большое спасибо!
Я даю вам весь мой код Django. Есть много точек улучшения, но это все еще в разработке.
Две первые функции выполняют установку приложения в магазине, а остальные - для учетной записи в твиттере.
from django.shortcuts import render, redirect
from django.http import Http404
from requests_oauthlib import OAuth1Session
from .config import Config as cfg
from .secret import SecretConfig as scfg
import requests
import json
def home(request):
return render(request, 'home.html')
def install(request):
auth_url = ""
if request.method == 'GET':
if request.GET.get('shop'):
shop = request.GET.get('shop')
else:
raise Http404
auth_url = "https://{}/admin/oauth/authorize?client_id={}&scope= {}&redirect_uri={}".format(
shop, cfg.SHOPIFY_CONFIG["API_KEY"], ",".join(cfg.SHOPIFY_CONFIG["SCOPE"]), cfg.SHOPIFY_CONFIG["REDIRECT_URI"])
print("\n\n----------Debug---------\n")
print("authentication url : {}".format(auth_url))
return redirect(auth_url)
def connect(request):
if request.method == 'GET':
error = False
if request.GET.get('shop'):
params = {
"client_id": cfg.SHOPIFY_CONFIG["API_KEY"],
"client_secret": cfg.SHOPIFY_CONFIG["API_SECRET"],
"code": request.GET.get('code')
}
# Get the permanent access token to this store
# and try to save it in the database
response = requests.post("https://{}/admin/oauth/access_token".format(request.GET.get('shop')),
params=params)
if 200 == response.status_code:
resp_json = json.loads(response.text)
return render(request, "home.html", locals())
else:
error = True
print("Failled to get access token:\n", response.status_code, response.text)
return render(request, "home.html", locals())
def get_twitter_token():
# create an object of OAuth1Session
request_token = OAuth1Session(client_key=scfg.TWITTER["API_KEY"],
client_secret=scfg.TWITTER["API_SECRET"])
# twitter endpoint to get request token
url = cfg.TWITTER["REQUEST_TOK_URL"]
# get request_token_key, request_token_secret and other details
data = request_token.get(url)
# split the string to get relevant data
data_token = str.split(data.text, '&')
oauth_token = str.split(data_token[0], '=')[1]
oauth_token_secret = str.split(data_token[1], '=')[1]
oauth_callback_confirmed = str.split(data_token[2], '=')[1]
token_request = (oauth_token, oauth_token_secret, oauth_callback_confirmed)
return token_request
def twitter_get_access_token(verifier, oauth_token, oauth_token_secret):
access_token = OAuth1Session(client_key=scfg.TWITTER["API_KEY"],
client_secret=scfg.TWITTER["API_SECRET"],
resource_owner_key=oauth_token,
resource_owner_secret=oauth_token_secret)
# url = 'https://api.twitter.com/oauth/access_token'
url = cfg.TWITTER["ACCESS_TOK_URL"]
data = {"oauth_verifier": verifier}
access_token_data = access_token.post(url, data=data)
# print(access_token_data.text)
access_token_string = str.split(access_token_data.text, '&')
# 0:oauth_token, 1:oauth_token_secret, 2:user_id, 3:screen_name
access_token_list = (access_token_string[0].split('=')[1],
access_token_string[1].split('=')[1],
access_token_string[2].split('=')[1],
access_token_string[3].split('=')[1])
print("\n\nToken for access : {}\n".format(access_token_list))
return access_token_list
def twitter_get_user_data(token_list):
# initialize the OAuth1Session to get users credentials
oauth_user = OAuth1Session(client_key=scfg.TWITTER["API_KEY"],
client_secret=scfg.TWITTER["API_SECRET"],
resource_owner_key=token_list[0],
resource_owner_secret=token_list[3])
# the post url
url_user = 'https://api.twitter.com/1.1/account/verify_credentials.json'
# we want also the user email
params = {"include_email": 'true'}
user_data = oauth_user.get(url_user, params=params)
return user_data.json()
def twitter_callback(request):
oauth_scrt = ""
# if we have not do the request yet
if not request.GET.get('oauth_token'):
# send a request to have token_request
token_request = get_twitter_token()
# if oauth_callback_confirmed is true
if token_request[2]:
oauth_token = token_request[0]
oauth_scrt = token_request[1]
# redirect the user to the twitter authentication page
return redirect(cfg.TWITTER["AUTH_URL"] +
"oauth_token=" + str(oauth_token))
# if twitter redirect the user here to send the oauth_verifier key
if request.GET.get('oauth_token') and request.GET.get('oauth_verifier'):
oauth_token = request.GET.get('oauth_token')
oauth_verifier = request.GET.get('oauth_verifier')
# get access token
access_token_list = twitter_get_access_token(oauth_verifier,
oauth_token,
oauth_scrt)
# get the user's data from twitter
user_data = twitter_get_user_data(access_token_list)
# show the data to the console
print("The user data tab : {}" .format(user_data))
return render(request, 'connected.html', locals())
return render(request, 'home.html')