通过基于django的RESTful Web服务对Web和移动应用程序进行身份验证

时间:2012-08-30 22:09:23

标签: django authentication restful-authentication

我正在为我的公司开发一个具有以下架构的解决方案:基于django构建的 RESTfull Web服务,为 Web客户端应用提供身份验证和持久层和移动客户端应用(使用 phonegap 编写)。

我们在互联网上一直在寻找有关客户端身份验证方法的内容,为网络和移动客户端应用提供支持,并且从我们发现的(非常差)我们考虑生成API密钥对于从移动客户端应用程序登录的每个用户,并将此API密钥保存在设备的本地存储中;并且,在Web客户端中,使用传统的cookie会话管理,包括POST,PUT和DELETE请求中的CSRF令牌。

我们想知道身份验证方法的最佳做法是什么,这种方法是否足够好?有没有其他方法来处理身份验证?哪一个是最好的?

我们正试图使用​​ oAuth 来取消,因为它增加了我们开发的复杂性。

我们已经检查了this question但是它的答案对我们没有多大帮助,因为我们正在使用phonegap,并且具有上述架构。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

如果你真的真的想要创建自己的解决方案。在oAuth时代之前,这是我过去的糟糕解决方案。

  1. 创建使用username / pass成功登录后返回某个键的视图,并将生成的access_key添加到db
  2. 检查请求中的键=>如果存在于db =>登录

    #pseudo code
    #view  
    from django.contrib.auth import authenticate, login
    
    def get_my_token(request, username, password):
        user = authenticate(username, password)
        if user is not None:
            login(request,user)
            #first  should check has access_key 
            try:
                return  UserAuth.objects.filter(user=user).access_key
            except:
               pass
            access_key = 'somecrazy_random_unique_number' 
    
            user_auth = UserAuth()
            user_auth.user = user
            user_auth.access_key = access_key
            user_auth.save()
            return access_key
    
  3. 现在,您可以在某处保存access_key,并将“access_key_or_any_other_name”标题添加到每次休息资源调用中。创建身份验证中间件,而不是auth后端。

        #auth_middelware 
        class StupidNoAuthMid(object):
            def process_request(self, request):  
                access_key = reuest.META['access_key_or_any_other_name']:
                try:
                    user = UserAuth.objects.filter(access_key=acces_key).user
                    auth.login(request, user) 
                except:
                    pass
    

    你不想重新发明轮子。使用oAauth,您可以保存access_token以供将来使用。