Spotify API回调URL中有'#'而不是'?'如何在python django中访问参数

kjthegm6  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(137)

我正在使用Spotify提供的隐式授予授权(1/3)类型的授权。
回调URL看起来像这样
http://localhost:8000/callback/#access_token=BQDRRPQ1Nulwcxx...mFNtnTsVUNlkCg&token_type=Bearer&expires_in=3600&state=NtiLgMVtLPx926Ay
如果是
http://localhost:8000/callback/**?**access_token
然后,我可以在我的视图中使用request.GET获取查询参数,但由于它有**#**,request.GET返回空字典。
我还尝试了request.build_absolute_uri(),但它只返回http://localhost:8000/callback/
这是我的观点

def callback(request, format=None):
    print(request.GET)
    if "access_token" in request.GET:
        print(request.GET["access_token"])

    return HttpResponse("Callback")

我希望request.GETaccess_token,expires in和URI中的参数,但我得到的是空的dict。

liwlm1x9

liwlm1x91#

在Spotify使用的隐式授权流程中,访问令牌和其他参数通常包含在回调URL的片段标识符中(在“#”之后)。但是,片段标识符并不是由浏览器发送到服务器的,所以你不能在Django视图中使用request.GET来获取这些参数。
相反,您可以在客户端使用JavaScript访问片段标识符及其参数。下面是一个如何使用JavaScript检索访问令牌并将其发送到服务器的示例:

const fragmentString = window.location.hash.substring(1); // Get the fragment identifier without the '#'
const params = new URLSearchParams(fragmentString); // Parse the parameters
const accessToken = params.get('access_token'); // Retrieve the access_token parameter

// Send the access token to your server using an AJAX request
const url = 'http://your-server-endpoint';
const data = { access_token: accessToken };

fetch(url, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify(data)
})
  .then(response => {
    // Handle the server's response
  })
  .catch(error => {
    // Handle errors
  });

在服务器端,您可以定义一个单独的端点来处理JavaScript代码发送的访问令牌:

# Django view to handle the access token
from django.http import JsonResponse

def handle_token(request):
    access_token = request.POST.get('access_token')
    # Process the access_token as needed
    return JsonResponse({'message': 'Access token received'})

确保在Django应用程序中设置了适当的URL路由来处理回调和令牌处理端点。
通过使用JavaScript从片段标识符中检索访问令牌并将其发送到服务器,您可以解决片段标识符不包含在服务器请求参数中的限制。

相关问题