Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 关于Github OAuth身份验证_Python_Django_Oauth - Fatal编程技术网

Python 关于Github OAuth身份验证

Python 关于Github OAuth身份验证,python,django,oauth,Python,Django,Oauth,我正在尝试通过Django站点上的Github进行身份验证。这就是我想到的: import string import random import urllib from django.conf import settings from django.core.urlresolvers import reverse from django.shortcuts import redirect from django.utils.crypto import constant_time_compar

我正在尝试通过Django站点上的Github进行身份验证。这就是我想到的:

import string
import random
import urllib

from django.conf import settings
from django.core.urlresolvers import reverse
from django.shortcuts import redirect
from django.utils.crypto import constant_time_compare
from django.contrib.auth import login

from rauth import OAuth2Service
from mongoengine.django.auth import User

from utils import make_absolute


SESSION_KEY = '_oauth_access_token'
SESSION_STATE = '_oauth_state'

github = OAuth2Service(
    client_id=settings.GITHUB_APP_ID,
    client_secret=settings.GITHUB_API_SECRET,
    name='github',
    authorize_url='https://github.com/login/oauth/authorize',
    access_token_url='https://github.com/login/oauth/access_token',
    base_url='http://github.com/')


def random_string():
    return ''.join(random.choice(string.ascii_letters + string.digits)
                   for _ in xrange(random.randint(27, 49)))


def flush_and_set(request, key, value):
    if key in request.session:
        if request.session[key] != value:
            request.session.flush()
    else:
        request.session.cycle_key()
    request.session[key] = value


def start_pipeline(request):
    state = random_string()
    flush_and_set(request, SESSION_STATE, state)
    return redirect(github.get_authorize_url(
                        redirect_uri=make_absolute(reverse('auth-pipeline-end')),
                        state=state))


def end_pipeline(request):
    if not constant_time_compare(request.session[SESSION_STATE],
                                 request.GET['state']):
        return redirect('home')
    session = github.get_auth_session(data={'code': request.GET['code'],
                                            'redirect_uri':
                                            make_absolute(reverse('home'))})
    flush_and_set(request, SESSION_KEY, session.access_token)
    user_data = session.get('https://api.github.com/user?' +
                            urllib.urlencode({'access_token':
                                              session.access_token})).json()
    username = user_data['login']
    try:
        user = User.objects.get(username=username)
    except User.DoesNotExist:
        user = User(username=username)
    for field in ('email',):
        d = user_data[field]
        if d:
            setattr(user, field, d)
    user.backend = 'mongoengine.django.auth.MongoEngineBackend'
    user.save()
    login(request, user)
    return redirect('home')
我有两个问题:

  • 这样做安全吗
  • 我应该设置会话的到期日期吗?因为就现在而言,我觉得它永远不会过期

  • 注意:我也在使用rauth:

    它可能不够安全,并且缺少一些细节

    • 要获得更安全的状态值,请使用
    • 你的课程是什么?默认情况下,它们不会出现,也不应该出现
    • 重定向是否受HTTPS保护
    • 您对GitHub的所有请求都是通过HTTPS发送的吗?也获得代币后
  • 默认过期时间为2周,但OAuth 2访问令牌通常会更快过期。然而,我相信GitHub令牌永远不会过期,所以一个改进是在关闭会话时以及不再需要时使会话过期


  • 也就是说,我强烈建议您使用GitHub登录,而不是滚动您自己的GitHub登录,因为该项目对它有更多的关注,并且已经有一段时间了。

    不如它可能的安全,并且缺少一些细节

    • 要获得更安全的状态值,请使用
    • 你的课程是什么?默认情况下,它们不会出现,也不应该出现
    • 重定向是否受HTTPS保护
    • 您对GitHub的所有请求都是通过HTTPS发送的吗?也获得代币后
  • 默认过期时间为2周,但OAuth 2访问令牌通常会更快过期。然而,我相信GitHub令牌永远不会过期,所以一个改进是在关闭会话时以及不再需要时使会话过期


  • 也就是说,我强烈建议您使用GitHub登录,而不是滚动您自己的GitHub登录,因为该项目有更多的人关注它,并且已经有一段时间了。

    谢谢您的回答!所以不,会话不是基于cookie的(我知道它们应该是这样的?)。我的站点不在HTTPS上,但是所有对Github的请求都在HTTPS上。我以前使用过django social auth,但遇到了问题,我选择推出自己的解决方案(我只需要Github登录)。我可能会再试一次。它们不应该是基于cookie的,将编辑答案。此外,如果您的站点不在https上,如果他们试图窃取/猜测您的客户端机密,则可以嗅探身份验证代码并使用其获取访问令牌。当然,如果您不使用https,则可能会发生许多其他攻击。因此,如果您要使用OAuth 2,请使用https。感谢您的建议。我会为我的域名搜索HTTPS。谢谢你的回答!所以不,会话不是基于cookie的(我知道它们应该是这样的?)。我的站点不在HTTPS上,但是所有对Github的请求都在HTTPS上。我以前使用过django social auth,但遇到了问题,我选择推出自己的解决方案(我只需要Github登录)。我可能会再试一次。它们不应该是基于cookie的,将编辑答案。此外,如果您的站点不在https上,如果他们试图窃取/猜测您的客户端机密,则可以嗅探身份验证代码并使用其获取访问令牌。当然,如果您不使用https,则可能会发生许多其他攻击。因此,如果您要使用OAuth 2,请使用https。感谢您的建议。我将研究我的域的HTTPS。