'Return a dictionary with authentication information, or ``None``
if no valid auth_tkt is attached to ``request``'

def identify(self, request):

    environ = request.environ
    cookie = request.cookies.get(self.cookie_name)
    if (cookie is None):
        return None
    if self.include_ip:
        remote_addr = environ['REMOTE_ADDR']
    else:
        remote_addr = '0.0.0.0'
    try:
        (timestamp, userid, tokens, user_data) = self.parse_ticket(self.secret, cookie, remote_addr, self.hashalg)
    except self.BadTicket:
        return None
    now = self.now
    if (now is None):
        now = time_mod.time()
    if (self.timeout and ((timestamp + self.timeout) < now)):
        return None
    userid_typename = 'userid_type:'
    user_data_info = user_data.split('|')
    for datum in filter(None, user_data_info):
        if datum.startswith(userid_typename):
            userid_type = datum[len(userid_typename):]
            decoder = self.userid_type_decoders.get(userid_type)
            if decoder:
                userid = decoder(userid)
    reissue = (self.reissue_time is not None)
    if (reissue and (not hasattr(request, '_authtkt_reissued'))):
        if ((now - timestamp) > self.reissue_time):
            tokens = list(filter(None, tokens))
            headers = self.remember(request, userid, max_age=self.max_age, tokens=tokens)
            def reissue_authtkt(request, response):
                if (not hasattr(request, '_authtkt_reissue_revoked')):
                    for (k, v) in headers:
                        response.headerlist.append((k, v))
            request.add_response_callback(reissue_authtkt)
            request._authtkt_reissued = True
    environ['REMOTE_USER_TOKENS'] = tokens
    environ['REMOTE_USER_DATA'] = user_data
    environ['AUTH_TYPE'] = 'cookie'
    identity = {}
    identity['timestamp'] = timestamp
    identity['userid'] = userid
    identity['tokens'] = tokens
    identity['userdata'] = user_data
    return identity
