Вход в систему клиентов через API shopify - PullRequest
0 голосов
/ 14 января 2019

Вход в систему через 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...