首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用django-allauth进行身份验证找到用户的patreon承诺层

如何使用django-allauth进行身份验证找到用户的patreon承诺层
EN

Stack Overflow用户
提问于 2019-05-21 00:52:27
回答 2查看 1.7K关注 0票数 6

我使用django-allauth对用户进行身份验证(使用Patreon的API v1),它向数据库中添加了一个包含以下信息的json。我想在网站上显示额外的内容,如果用户的承诺符合某一特定级别(或高于一层)。

代码语言:javascript
复制
{
  "attributes": {
    "about": null,
    "can_see_nsfw": true,
    "created": "2019-05-20T20:29:02.000+00:00",
    "default_country_code": null,
    "discord_id": null,
    "email": "admin@email.com",
    "facebook": null,
    "facebook_id": null,
    "first_name": "Adm",
    "full_name": "Adm Nsm",
    "gender": 0,
    "has_password": true,
    "image_url": "https://c8.patreon.com/2/200/21383296",
    "is_deleted": false,
    "is_email_verified": false,
    "is_nuked": false,
    "is_suspended": false,
    "last_name": "Nsm",
    "social_connections": {
      "deviantart": null,
      "discord": null,
      "facebook": null,
      "instagram": null,
      "reddit": null,
      "spotify": null,
      "twitch": null,
      "twitter": null,
      "youtube": null
    },
    "thumb_url": "https://c8.patreon.com/2/200/21383296",
    "twitch": null,
    "twitter": null,
    "url": "https://www.patreon.com/user?u=21383296",
    "vanity": null,
    "youtube": null
  },
  "id": "21383296",
  "relationships": {
    "pledges": {
      "data": [
        {
          "id": "24461189",
          "type": "pledge"
        }
      ]
    }
  },
  "type": "user"
}

起初,我认为relationships.pledges.data.id会有当前层的ID,然后我设法为特定用户添加了一个额外的内容块,但显然这只是一厢情愿的想法;在用第二个帐户测试ID之后,我认为我的保证级别似乎每次都不同。我想我可能需要从帕特伦API要求更多的信息,但我不知道如何得到我需要的回来。

编辑:

根据我所能收集到的信息,我需要从currently_entitled_tiers请求/api/oauth2/v2/members/{id}

问题是,在用户登录后,所需的ID并不是相同的ID。因此,我首先需要使用已经生成的oauth访问令牌,并获得长ID号的/api/oauth2/v2/identity

我当前的问题是,当我试图从/api/oauth2/v2/identity获取ID时,我会收到一个401错误代码:

代码语言:javascript
复制
<Response [401]>
{'errors': [{'code': 1, 'code_name': 'Unauthorized', 'detail': "The server could not verify that you are authorized to access the URL requested.  You either supplied the wrong credentia
ls (e.g. a bad password), or your browser doesn't understand how to supply the credentials required.", 'id': 'b298d8b1-73db-46ab-b3f4-545e6f934599', 'status': '401', 'title': 'Unauthori
zed'}]}

我要发送的是:

代码语言:javascript
复制
headers = {"authorization": "Bearer " + str(access_token)}  # User's Access Token
req = requests.get("https://patreon.com/api/oauth2/v2/identity?include=memberships", headers=headers)

如果我通过/api/oauth2/v2/campaigns/{campaign_id}/members获得了正确的ID,我可以从/api/oauth2/v2/members/{id}请求并得到我需要的东西,但是使用当前登录用户获取ID的中间步骤使我无法获得他们的ID。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-23 21:24:11

我通过直接改变django-allauth得到了承诺。由于它使用的是API v1,所以您需要更改作用域,以便从API v2端点获取信息。为此,我必须修改patreon提供程序和来自allauth的视图。

这仅仅是我在python中的第二个项目,所以请原谅可能混乱或不理想的代码:

provider.py

代码语言:javascript
复制
    # Change
    def get_default_scope(self):
        return ['pledges-to-me', 'users', 'my-campaign']

    # to
    def get_default_scope(self):
        return ['identity', 'identity[email]', 'campaigns', 'campaigns.members']

views.py

代码语言:javascript
复制
"""
Views for PatreonProvider
https://www.patreon.com/platform/documentation/oauth
"""

import requests

from allauth.socialaccount.providers.oauth2.views import (
    OAuth2Adapter,
    OAuth2CallbackView,
    OAuth2LoginView,
)

from .provider import PatreonProvider


class PatreonOAuth2Adapter(OAuth2Adapter):
    provider_id = PatreonProvider.id
    access_token_url = 'https://www.patreon.com/api/oauth2/token'
    authorize_url = 'https://www.patreon.com/oauth2/authorize'
    profile_url = 'https://www.patreon.com/api/oauth2/v2/identity?include=memberships&fields[user]=email,first_name,full_name,image_url,last_name,social_connections,thumb_url,url,vanity'


    def complete_login(self, request, app, token, **kwargs):
        resp = requests.get(self.profile_url,
                            headers={'Authorization': 'Bearer ' + token.token})
        extra_data = resp.json().get('data')

        try:
            member_id = extra_data['relationships']['memberships']['data'][0]['id']
            member_url = f'https://www.patreon.com/api/oauth2/v2/members/{member_id}?include=currently_entitled_tiers&fields%5Btier%5D=title'
            resp_member = requests.get(member_url,
                                headers={'Authorization': 'Bearer ' + token.token})
            pledge_title = resp_member.json()['included'][0]['attributes']['title']
            extra_data["pledge_level"] = pledge_title

        except (KeyError, IndexError):
            extra_data["pledge_level"] = None
            pass


        return self.get_provider().sociallogin_from_response(request,
                                                             extra_data)


oauth2_login = OAuth2LoginView.adapter_view(PatreonOAuth2Adapter)
oauth2_callback = OAuth2CallbackView.adapter_view(PatreonOAuth2Adapter)

这样,您可以从API v2端点(仍然使用APIv1客户端,尚未测试它是否与API v2客户端一起工作)请求,并且它将将质押标题添加到社会帐户上的extra_data字段中。

票数 4
EN

Stack Overflow用户

发布于 2019-06-28 03:48:32

我已经更新了django-allauth,使用了Nick S的部分答案,以启用Patreon v2 (截至django-allauth0.40.0)。

要使用API v2,现在只需更改SOCIALACCOUNT_PROVIDERS在settings.py中的patreon条目:

settings.py (将其添加到末尾)

代码语言:javascript
复制
SOCIALACCOUNT_PROVIDERS = {
    'patreon': {
        'VERSION': 'v2',
    }
}

默认情况下,这还会将质押层添加到每个用户的社交帐户中,并将其存储在extra_data['pledge_level']中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56229785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档