6

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

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

我们想知道身份验证方法的最佳实践是什么,这种方法是否足够好?还有其他方法可以处理身份验证吗?哪一个是最好的?

我们试图避免使用oAuth,因为它增加了我们开发的复杂性。

我们已经检查了这个问题,但它的答案对我们没有太大帮助,因为我们使用的是 phonegap,并且具有上述架构。

谢谢你的帮助!

4

1 回答 1

1

如果您真的真的很想创建自己的解决方案。这是我在 oAuth 时代之前的旧错误解决方案。

  1. 创建使用用户名/密码成功登录后返回一些密钥的视图,并将生成的 access_key 添加到数据库
  2. 检查请求中的密钥 => 如果数据库中存在 => 登录

    #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
    

现在您可以将 access_key 保存在某处,并将作为标题“access_key_or_any_other_name”添加到每次调用休息资源时。创建身份验证中间件,而不是身份验证后端。

    #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 以备将来使用。

于 2012-09-04T14:24:10.410 回答