PKCE Parameters for Snapchat



我正试图为Snapchat编写一个django-allauth提供程序,但遇到了障碍。

Snapchat需要PKCE参数。我首先更改了AUTH_PARAMS。

'AUTH_PARAMS': {
'code_challenge': 'state',
'code_challenge_method': "S256"
}

这只会在我得到代码响应后,在Access_Token请求时导致Snapchat API的无效响应。

这个错误是我犯的第一个错误。

{'error': 'invalid_request', 'error_description': 'Invalid code_verifier length.', 'state': ''}

在覆盖SocialLogin.stash_state之后,我收到了这个错误。

{'error': 'invalid_grant', 'error_description': 'Invalid code_verifier.', 'state': ''}

根据我对所有身份验证代码的挖掘,我在PKCE参数或base64 Url SHA256编码的代码库中找不到任何东西。

我愿意实现这个解决方案,但我一直在寻找状态参数的子类,然后匹配它们。

Snapchat文档也存在一些问题。

https://gist.github.com/CisarJosh/733bb76a13f36f0a7944f05d257bb3f6

这是我一些尝试的要点。

我想这会让你开始:

from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider
import secrets
import base64
import hashlib
import urllib.parse
VOCAB = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-._~0123456789"

def generate_code_verifier() -> str:
length = max(43, secrets.randbelow(129))
return "".join([secrets.choice(VOCAB) for i in range(0, length)])

def generate_state() -> str:
return secrets.token_urlsafe(32)

class SnapchatProvider(OAuth2Provider):
def get_auth_params(self, request, action):
params = super().get_auth_params(request, action)
code_verifier = generate_code_verifier()
state = generate_state()
# store this state token somewhere so it can be looked up
challenge = hashlib.sha256(code_verifier).digest()
encoded = base64.b64encode(challenge)
urlencoded = urllib.parse.quote_plus(encoded)
params.update(state=state, code_challenge=urlencoded)

return params

这是我对该部分规范的解释。

最新更新