精华内容
下载资源
问答
  • 2018-10-16 08:48:28

    1、token 的全称是json web token。
    2、在http中,进行身份认证。
    3、http通信是无状态的,客户端的请求到了服务端,服务端的答复无法对原来的客户端进行识别
    4、传统使用session机制:客户端登录成功后,服务端返回一个sessionid给客户端,客户端将此保存在cookie中。需要再次发送请求时,携带cookie中的sessionid到服务端,服务端缓存了session,它就知道哪个用户发送了请求,并将返回内容给客户端。session可能存储到内存、磁盘或数据库,服务器需要定期去清理过期的session。
    5、token机制:客户端通过账号密码登录后,服务端会签发一个token,返回客户端。客户端将token存储到cookie、或localstorge( localstorge.set(item,propety))。发送请求时,将token放在请求头里面。服务端验证token后,就会验证token,成功的话就返回请求数据。服务端不需要存储用户的登录记录。

    更多相关内容
  • 在整个开发设计过程中,我们知道这个东西,却不知道为什么要用。不知道基本原理。今天我就带大家来分析一下这个事情。首先,我们先解释一下他的意思:1.Token介绍:Token经常在手机客户端向服务器端询问数据信息,...

    对于初学者来说,Token和Session的应用不可避免地局限于困境。在整个开发设计过程中,我们知道这个东西,却不知道为什么要用。不知道基本原理。今天我就带大家来分析一下这个事情。

    首先,我们先解释一下他的意思:

    1.Token介绍:Token经常在手机客户端向服务器端询问数据信息,服务器端经常去数据库查询登录名和登录密码并进行对比,以区分登录名和登录密码是否合适,并做相对提醒。在这样的情况下,Token应运而生。

    2.Token的定义:Token是服务器转换的字符串数组,作为手机客户端申辩的动态密码。第一次登录后,网络服务器将该令牌转换并返回给手机客户端。之后手机客户端只需要携带这个Token就可以为数据信息求情了,不用再携带登录名和登录密码。

    3.应用Token的目的:Token的目的是缓解网络服务器的工作压力,减少频繁的数据库查询,使网络服务器更强大。

    了解Token的实际意义后,我们会更好地理解为什么要使用它。

    二、Token怎么用?

    这是本文的重点,在这里我还详细介绍了两种常用的方法。

    1.使用机器设备的设备号/mac详细地址作为令牌(强烈推荐)

    手机客户端:登录时,手机客户端获取机器的设备号/mac详细地址,作为参数传送给服务器。

    服务器端:接收到主参数后,服务器端接受带有自变量的查询,并将其作为Token存储在数据库中,并在会话中设置Token。手机客户端每次高兴都要统一屏蔽,将手机客户端发送的令牌和服务器会话中的令牌进行比较。相同的海关放行,不同的海关拒收。

    分析:此时手机客户端和服务器统一了唯一的Token,保证每台机器都有唯一的通话。这种方法的缺陷是手机客户端必须以设备号/mac详细地址作为参数传输,服务器也必须存储;优点是手机客户端不需要重新登录。如果一次登录就可以一直使用,请求超时的问题由网络服务器解决。怎么处理?如果网络服务器的Token请求超时,网络服务器只需要在数据库查询中查找手机客户端发送的Token,另外取值到自变量Token,这样Token请求超时就被重新记录下来。

    2.使用会话值作为令牌

    移动客户端:移动客户端只需携带登录名和密码即可登录。

    手机客户端:手机客户端收到登录名和登录密码后,会进行区分。如果合适,它会将本地获得的sessionID作为Token返回给手机客户端,然后手机客户端只需要携带恳求数据信息即可。

    分析:这种方式的优点是方便,不需要存储数据信息,缺点是会话到期后,手机客户端必须重新登录才能浏览数据信息。

    3.整个申请过程中的问题及解决方法?

    刚才我们很轻松的详细介绍了Token的两种应用方法,但是在整个应用的过程中,还是有各种各样的问题。在令牌的第一种方法中,我们隐藏了当网络不稳定或有高并发请求时重复提交数据信息的问题。

    总结:以上是我在开发设计中应用Token和session的总结。如果有不恰当的描述,请立即改正,我会改正,谢谢。我理解应用方法越来越多。这里只做自我推荐,期待大家明确提出你的申请方式。我们一起讨论,一起学习,一起训练,一起发展。此外,我们将对我那些对这些方面缺乏了解的朋友表示一些帮助和感谢。

    本文由网上采集发布,不代表我们立场,转载联系作者并注明出处:http://www.wxztseo.com/seozmt/14414.html

    展开全文
  • jwt中的token里面包含哪些内容?

    千次阅读 2021-04-08 22:09:09
    JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。 2、作用 1、Authorization (授权) ...

    1、定义

    JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

    2、作用

    1、Authorization (授权) : 这是使用JWT的最常见场景。一旦用户登录,后续每个请求都将包含JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是现在广泛使用的JWT的一个特性,因为它的开销很小,并且可以轻松地跨域使用。

    2、Information Exchange (信息交换) : 对于安全的在各方之间传输信息而言,JSON Web Tokens无疑是一种很好的方式。因为JWTs可以被签名,例如,用公钥/私钥对,你可以确定发送人就是它们所说的那个人。另外,由于签名是使用头和有效负载计算的,您还可以验证内容没有被篡改。

    3、结构

    生成的token结构是:header.payload.signature,例如:

    在这里插入图片描述
    接下来让我们来具体看一下这些结构中到底包含什么

    3.1、Header

    header典型的由两部分组成:token的类型(“JWT”)和算法名称(比如:HMAC SHA256或者RSA等等)

    在这里插入图片描述
    然后,用Base64对这个JSON编码就得到JWT的第一部分

    3.2、Payload

    JWT的第二部分是payload,它包含声明(要求)。声明是关于实体(通常是用户信息,也就是程序员放入token中的数据)和其他数据的声明。声明有三种类型: registered, public 和 private。

    Registered claims : 这里有一组预定义的声明,它们不是强制的,但是推荐。比如:iss (issuer), exp (expiration time), sub (subject), aud (audience)等。
    Public claims : 可以随意定义。
    Private claims : 用于在同意使用它们的各方之间共享信息,并且不是注册的或公开的声明。

    在这里插入图片描述
    对payload进行Base64编码就得到JWT的第二部分

    注意: 不要在JWT的payload或header中放置敏感信息,除非它们是加密的。

    3.3、Signature

    为了得到签名部分,你必须有编码过的header、编码过的payload、一个秘钥,签名算法是header中指定的那个,然对它们签名即可。

    在这里插入图片描述
    签名是用于验证消息在传递过程中有没有被更改,并且,对于使用私钥签名的token,它还可以验证JWT的发送方是否为它所称的发送方。

    4、生成token的代码

    public class JwtUtils {
    
        // 设置token的过期时间是一天
        private static final long EXPIRE = 1000 * 60 * 60 * 24;
        // 加盐
        private static final String APP_SECRET = "ukc8BDbRigUDaY6pZFfWus2jZWLPHO";
    
        /**
         * 获取token
         *
         * @param id       用户id
         * @param nickname 用户昵称
         * @return
         */
        public static String getJwtToken(String id, String nickname) {
    
            String JwtToken = Jwts.builder()
                    .setHeaderParam("typ", "JWT")
                    .setHeaderParam("alg", "HS256")
                    .setSubject("guli-user")
                    .setIssuedAt(new Date())
                    .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
                    .claim("id", id)
                    .claim("nickname", nickname)
                    .signWith(SignatureAlgorithm.HS256, APP_SECRET)
                    .compact();
    
            return JwtToken;
        }
        ………………
    }
    
    展开全文
  • Token中的信息

    千次阅读 2016-08-11 08:40:00
    Token中有哪些信息呢?这我们可以从一个api中得到, GetTokenInformation https://msdn.microsoft.com/en-us/library/windows/desktop/aa446671(v=vs.85).aspx 想要获取的信息类别 TOKEN_INFORMATION_CLASS ...

    Token中有哪些信息呢?这我们可以从一个api中得到,

    GetTokenInformation                       https://msdn.microsoft.com/en-us/library/windows/desktop/aa446671(v=vs.85).aspx

    想要获取的信息类别

    TOKEN_INFORMATION_CLASS

    typedef enum _TOKEN_INFORMATION_CLASS { 
      TokenUser                             = 1,
      TokenGroups,
      TokenPrivileges,
      TokenOwner,
      TokenPrimaryGroup,
      TokenDefaultDacl,
      TokenSource,
      TokenType,
      TokenImpersonationLevel,
      TokenStatistics,
      TokenRestrictedSids,
      TokenSessionId,
      TokenGroupsAndPrivileges,
      TokenSessionReference,
      TokenSandBoxInert,
      TokenAuditPolicy,
      TokenOrigin,
      TokenElevationType,
      TokenLinkedToken,
      TokenElevation,
      TokenHasRestrictions,
      TokenAccessInformation,
      TokenVirtualizationAllowed,
      TokenVirtualizationEnabled,
      TokenIntegrityLevel,
      TokenUIAccess,
      TokenMandatoryPolicy,
      TokenLogonSid,
      TokenIsAppContainer,
      TokenCapabilities,
      TokenAppContainerSid,
      TokenAppContainerNumber,
      TokenUserClaimAttributes,
      TokenDeviceClaimAttributes,
      TokenRestrictedUserClaimAttributes,
      TokenRestrictedDeviceClaimAttributes,
      TokenDeviceGroups,
      TokenRestrictedDeviceGroups,
      TokenSecurityAttributes,
      TokenIsRestricted,
      MaxTokenInfoClass
    } TOKEN_INFORMATION_CLASS, *PTOKEN_INFORMATION_CLASS;
    


    如此在这里我们一一获取下这些信息

    1.TOKEN_USER: https://msdn.microsoft.com/en-us/library/windows/desktop/aa379634(v=vs.85).aspx



    2.TOKEN_GROUPS: https://msdn.microsoft.com/en-us/library/windows/desktop/aa379624(v=vs.85).aspx





    以及各种Attributes的意义
    Value Meaning
    SE_GROUP_ENABLED 0x00000004L

    The SID is enabled for access checks. When the system performs an access check, it checks for access-allowed and access-denied access control entries (ACEs) that apply to the SID.

    A SID without this attribute is ignored during an access check unless the SE_GROUP_USE_FOR_DENY_ONLY attribute is set.

    SE_GROUP_ENABLED_BY_DEFAULT 0x00000002L

    The SID is enabled by default.

    SE_GROUP_INTEGRITY 0x00000020L

    The SID is a mandatory integrity SID.

    SE_GROUP_INTEGRITY_ENABLED 0x00000040L

    The SID is enabled for mandatory integrity checks.

    SE_GROUP_LOGON_ID 0xC0000000L

    The SID is a logon SID that identifies the logon session associated with an access token.

    SE_GROUP_MANDATORY 0x00000001L

    The SID cannot have the SE_GROUP_ENABLED attribute cleared by a call to the AdjustTokenGroups function. However, you can use the CreateRestrictedToken function to convert a mandatory SID to a deny-only SID.

    SE_GROUP_OWNER 0x00000008L

    The SID identifies a group account for which the user of the token is the owner of the group, or the SID can be assigned as the owner of the token or objects.

    SE_GROUP_RESOURCE 0x20000000L

    The SID identifies a domain-local group.

    SE_GROUP_USE_FOR_DENY_ONLY 0x00000010L

    The SID is a deny-only SID in a restricted token. When the system performs an access check, it checks for access-denied ACEs that apply to the SID; it ignores access-allowed ACEs for the SID.

    If thi


    3.TOKEN_PRIVILEGE https://msdn.microsoft.com/en-us/library/windows/desktop/aa379630(v=vs.85).aspx

    TOKEN_PRIVILEGE 跟USER RIGHTS还是有区别的

    typedef struct _TOKEN_PRIVILEGES {
      DWORD               PrivilegeCount;
      LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];
    } TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;
    

    typedef struct _LUID_AND_ATTRIBUTES {
      LUID  Luid;
      DWORD Attributes;
    } LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
    

    locally unique identifier

    (LUID) A 64-bit value that is guaranteed to be unique on the operating system that generated it until the system is restarted.

    唯一标志windows某存在对象 "X"  的身份

    An LUID_AND_ATTRIBUTES structure can represent an LUID whose attributes change frequently, 

    LUID_AND_ATTRIBUTES结构体能代表 状态经常发生变化的LUID,而LUID也可以代表一个PRIVILEGE....

    TOKEN_PRIVILEGES在内存中的形式



    Privilege 常量

                                                       https://msdn.microsoft.com/en-us/library/windows/desktop/bb530716(v=vs.85).aspx


    TOKEN_OWNER https://msdn.microsoft.com/en-us/library/windows/desktop/aa379628(v=vs.85).aspx

    The TOKEN_OWNER structure contains the default owner security identifier (SID) that will be applied to newly created objects.

    上段说明TOKEN_OWNER 结构体包含了一个默认的SID,它被用于新创建的对象---? 内核对象 如EVENT,MUTANT,SEMAPHORE...?,有待校验

    A pointer to a SID structure representing a user who will become the owner of any objects created by a process using this access token. The SID must be one of the user or group SIDs already in the token.

    被这个token关联的进程所创建的对象,被该SID表示的"用户"拥有,这个"用户"可以是 个体用户或者组 ,前提使他们得出现在Token中



    注意这个SID代表着的用户和Toke关联的用户不是同一个对象,


    TOKEN_PRIMARY_GROUP https://msdn.microsoft.com/en-us/library/windows/desktop/aa379629(v=vs.85).aspx

    The TOKEN_PRIMARY_GROUP structure specifies a group security identifier (SID) for an access token.

    该TOKEN_PRIMARY_GROUP 结构体指定了一个 组SID


    A pointer to a SID structure representing a group that will become the primary group of any objects created by a process using this access token. 

    The SID must be one of the group SIDs already in the token.

    代表着 组 的一个SID,这个组 将成为 拥有这个TOKEN的进程所创建an的 所有对象 的Primary group


     TOKEN_DEFAULT_DACL

    A pointer to an ACL structure assigned by default to any objects created by the user. The user is represented by the access token.

    一个指向ACL结构体的指针,该结构体在用户进程创建对象的时候被默认分配给该对象,暂时不分析这部分


    TOKEN_SOURCE https://msdn.microsoft.com/en-us/library/windows/desktop/aa379631(v=vs.85).aspx

    The TOKEN_SOURCE structure identifies the source of an access token

    TOKEN_SOURCE 结构体说明了该token的来源

    typedef struct _TOKEN_SOURCE {
      CHAR SourceName[TOKEN_SOURCE_LENGTH];
      LUID SourceIdentifier;
    } TOKEN_SOURCE, *PTOKEN_SOURCE;
    SourceName

    Specifies an 8-byte character string used to identify the source of an access token. This is used to distinguish between such sources as Session Manager, LAN Manager, and RPC Server. A string, rather than a constant, is used to identify the source so users and developers can make extensions to the system, such as by adding other networks, that act as the source of access tokens.

    指定8字节长的字符串,用来表示TOken的来源,这可被用来却分诸如 Session Manager,LAN Manager,RPC Server等来源,用字符串而不是一个常量

    表示,方便用户,对系统进行扩展,比如添加其他的 网络,用来作为Token的来源

    SourceIdentifier

    Specifies a locally unique identifier (LUID) provided by the source component named by the SourceName member. This value aids the source component in relating context blocks, such as session-control structures, to the token. This value is typically, but not necessarily, an LUID.

    SourceName成员代表的来源组件 提供的本地唯一标识符....



    TOKEN_TYPE https://msdn.microsoft.com/en-us/library/windows/desktop/aa379633(v=vs.85).aspx

    The TOKEN_TYPE enumeration contains values that differentiate between a primary token and an impersonation token.


    SECURITY_IMPERSONATION_LEVEL  https://msdn.microsoft.com/en-us/library/windows/desktop/aa379572(v=vs.85).aspx

    typedef enum _SECURITY_IMPERSONATION_LEVEL { 
      SecurityAnonymous,
      SecurityIdentification,
      SecurityImpersonation,
      SecurityDelegation
    } SECURITY_IMPERSONATION_LEVEL, *PSECURITY_IMPERSONATION_LEVEL;
    目前用不着,忽略直接pass

    If the access token is not an impersonation token, the function fails.

    如果token不是impersionation token函数失败


    TOKEN_SESSIONID

    indicates the Terminal Services session identifier that is associated with the token.If the token is associated with the terminal server client session, the session identifier is nonzero.In a non-Terminal Services environment, the session identifier is zero.

    If TokenSessionId is set with SetTokenInformation, the application must have the Act As Part Of the Operating System privilege, and the application must be enabled to set the session ID in a token.

    上段文字说明,TOEKN_SEESIONID 指出 与该token相关的 终端服务会话Terminal Services session ,如果相关Session是 Terminal Server Client session,则session id非0

    ,在 非终端  服务的环境下,session id为0,


    其他就不一一列举了,很多东西,自己还没仔细看过,上述样本贴码如下

    // TokenInformation.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <windows.h>
    #include <Sddl.h>
    #include <locale.h>
    VOID RetGroupDwordAttributesToStr(DWORD attributes,LPTSTR szAttributes )
    {
    	
    	UINT len = 0;
    	if(attributes & SE_GROUP_ENABLED)
    		len += wsprintf(szAttributes + len,TEXT("%s"),TEXT("SE_GROUP_ENABLED | "));
    	if(attributes & SE_GROUP_ENABLED_BY_DEFAULT)
    		len += wsprintf(szAttributes + len,TEXT("%s"),TEXT("SE_GROUP_ENABLED_BY_DEFAULT | "));
    	if(attributes & SE_GROUP_INTEGRITY)
    		len += wsprintf(szAttributes + len,TEXT("%s"),TEXT("SE_GROUP_INTEGRITY | "));
    	if(attributes & SE_GROUP_INTEGRITY_ENABLED)
    		len += wsprintf(szAttributes + len,TEXT("%s"),TEXT("SE_GROUP_INTEGRITY_ENABLED | "));
    	if(attributes & SE_GROUP_LOGON_ID)
    		len += wsprintf(szAttributes + len,TEXT("%s"),TEXT("SE_GROUP_LOGON_ID | "));
    	if(attributes & SE_GROUP_MANDATORY)
    		len += wsprintf(szAttributes + len,TEXT("%s"),TEXT("SE_GROUP_MANDATORY | "));
    	if(attributes & SE_GROUP_OWNER)
    		len += wsprintf(szAttributes + len,TEXT("%s"),TEXT("SE_GROUP_OWNER | "));
    	if(attributes & SE_GROUP_RESOURCE)
    		len += wsprintf(szAttributes + len,TEXT("%s"),TEXT("SE_GROUP_RESOURCE | "));
    	if(attributes & SE_GROUP_USE_FOR_DENY_ONLY)
    		len += wsprintf(szAttributes + len,TEXT("%s"),TEXT("SE_GROUP_USE_FOR_DENY_ONLY | "));
    	
    	return;
    }
    
    VOID RetPrivDwordAttributesToStr(DWORD attributes,LPTSTR szAttrbutes)
    {
    	UINT len = 0;
    	if(attributes & SE_PRIVILEGE_ENABLED)
    		len += wsprintf(szAttrbutes,TEXT(" SE_PRIVILEGE_ENABLED |"));
    	if(attributes & SE_PRIVILEGE_ENABLED_BY_DEFAULT)
    		len += wsprintf(szAttrbutes,TEXT(" SE_PRIVILEGE_ENABLED_BY_DEFAULT |"));
    	if(attributes & SE_PRIVILEGE_REMOVED)
    		len += wsprintf(szAttrbutes,TEXT(" SE_PRIVILEGE_REMOVED |"));
    	if(attributes & SE_PRIVILEGE_USED_FOR_ACCESS)
    		len += wsprintf(szAttrbutes,TEXT(" SE_PRIVILEGE_USED_FOR_ACCESS |"));
    	if(szAttrbutes[0] == 0)
    		wsprintf(szAttrbutes,TEXT(" SE_PRIVILEGE_DISABLED |"));
    	return ;
    }
    
    VOID PrintTokenInfoXX(HANDLE hToken,TOKEN_INFORMATION_CLASS tic )
    {
    	setlocale(LC_ALL,"");
    	switch(tic)
    	{
    		case TokenUser:
    		{
    			//The TOKEN_USER structure identifies the user associated with an access token.
    			//TOKEN_USER 结构体 是用来标志和 Token相关联的用户
    			PVOID ptu = NULL;
    			DWORD dwRet = 0;
    			if(!GetTokenInformation(
    				hToken,
    				tic,
    				ptu,
    				dwRet,
    				&dwRet
    				))
    			{
    				DWORD error = GetLastError( );
    				if(error == ERROR_INSUFFICIENT_BUFFER)
    				{
    					ptu =(LPVOID) calloc(dwRet,1);
    					if(!GetTokenInformation(
    						hToken,
    						tic,
    						ptu,
    						dwRet,
    						&dwRet
    						))
    					{
    						MessageBox(0,TEXT("获取TokenUser信息失败"),0,0);
    						return ;
    					}
    					
    					goto SUCCESS_TokenUser;
    				}
    				MessageBox(0,TEXT("获取TokenUser信息失败"),0,0);
    				return ;
    			}
    
    		SUCCESS_TokenUser:
    			LPTSTR lpszSID = NULL;
    			ConvertSidToStringSid( ((PTOKEN_USER)ptu)->User.Sid,&lpszSID );
    			_tprintf(TEXT("USER SID: %s\t"),lpszSID);
    			TCHAR name[MAX_PATH] = {0};
    			DWORD len1 = MAX_PATH;
    			DWORD len2 = MAX_PATH;
    			TCHAR domain[MAX_PATH] = {0};
    			SID_NAME_USE pnu;
    			LookupAccountSid(NULL,((PTOKEN_USER)ptu)->User.Sid,name,&len1,domain,&len2,&pnu);
    			_tprintf(TEXT("USER NAME: %s of domain %s\n"),name,domain);
    			LocalFree(lpszSID);
    			free(ptu);
    			_tprintf(TEXT("****************************************************************************************************\n"));
    			_tprintf(TEXT("****************************************************************************************************\n\n\n"));
    		}
    		break;
    
    		case TokenGroups:
    		{
    			PTOKEN_GROUPS ptg = NULL;
    			DWORD dwRet = 0;
    			if(!GetTokenInformation(hToken,
    				TokenGroups,
    				ptg,
    				dwRet,
    				&dwRet
    				))
    			{
    				DWORD error = GetLastError( );
    				if(error == ERROR_INSUFFICIENT_BUFFER)
    				{
    					ptg = (PTOKEN_GROUPS)calloc(dwRet,1);
    					if(!GetTokenInformation(hToken,
    						TokenGroups,
    						ptg,
    						dwRet,
    						&dwRet
    						))
    					{
    						MessageBox(0,TEXT("获取TokenGroups信息失败"),0,0);
    						return ;
    					}
    					goto SUCCESS_TokenGroups;
    				}
    				MessageBox(0,TEXT("获取TokenGroups信息失败"),0,0);
    				return ;
    			}
    		SUCCESS_TokenGroups:
    			for(int i = 0; i < ptg->GroupCount; i++)
    			{
    				LPTSTR lpszSID = NULL;
    				ConvertSidToStringSid((ptg->Groups+i)->Sid,&lpszSID);
    				_tprintf(TEXT("Group SID is %s\t"),lpszSID);
    
    				TCHAR name[MAX_PATH] = {0};
    				DWORD len1 = MAX_PATH;
    				DWORD len2 = MAX_PATH;
    				TCHAR domain[MAX_PATH] = {0};
    				SID_NAME_USE pnu;
    				LookupAccountSid(NULL,ptg->Groups[i].Sid,name,&len1,domain,&len2,&pnu);
    				_tprintf(TEXT("GROUP NAME: %s of domain %s"),name,domain);
    
    				TCHAR szAttributes[1024] = {0};
    				RetGroupDwordAttributesToStr((ptg->Groups + i)->Attributes,szAttributes);
    				_tprintf(TEXT("\n\t Attributes: %70s"),szAttributes);
    				_tprintf(TEXT("\n----------------------------------------------------------------------------------------\n"));
    				LocalFree(lpszSID);
    			}
    			free(ptg);
    			_tprintf(TEXT("****************************************************************************************************\n"));
    			_tprintf(TEXT("****************************************************************************************************\n\n\n"));
    		}
    		break;
    
    		case TokenPrivileges:
    		{
    			PTOKEN_PRIVILEGES ppriv = NULL;
    			DWORD dwRet = 0;
    			if(!GetTokenInformation(hToken,
    				TokenGroups,
    				ppriv,
    				dwRet,
    				&dwRet
    				))
    			{
    				DWORD error = GetLastError( );
    				if(error == ERROR_INSUFFICIENT_BUFFER)
    				{
    					ppriv = (PTOKEN_PRIVILEGES)calloc(dwRet,1);
    					if(!GetTokenInformation(hToken,
    						TokenPrivileges,
    						ppriv,
    						dwRet,
    						&dwRet
    						))
    					{
    						MessageBox(0,TEXT("获取TokenPrivilege信息失败"),0,0);
    						return ;
    					}
    					goto SUCCESS_TokenPrivilege;
    				}
    				MessageBox(0,TEXT("获取TokenPrivilege信息失败"),0,0);
    				return ;
    			}
    		SUCCESS_TokenPrivilege:
    			for(int i = 0; i < ppriv->PrivilegeCount; i++)
    			{
    				TCHAR lpszPriv[MAX_PATH] = {0};
    				DWORD dwRet = MAX_PATH;
    				BOOL n=LookupPrivilegeName(
    					NULL,
    					&(ppriv->Privileges[i].Luid),
    					lpszPriv,
    					&dwRet
    					);
    				_tprintf(TEXT("[%d:]\t%s"),i,lpszPriv);
    				TCHAR lpszAttrbutes[1024] = {0};
    				RetPrivDwordAttributesToStr(ppriv->Privileges[i].Attributes,lpszAttrbutes);
    				_tprintf(TEXT("\n\t %s\n\n"),lpszAttrbutes);
    			}
    
    			free(ppriv);
    			_tprintf(TEXT("****************************************************************************************************\n"));
    			_tprintf(TEXT("****************************************************************************************************\n\n\n"));
    		}
    		break;
    
    		case TokenOwner:
    		{
    			PTOKEN_OWNER ptOwner = NULL;
    			DWORD dwRet = 0;
    			if(!GetTokenInformation(hToken,
    				TokenOwner,
    				ptOwner,
    				dwRet,
    				&dwRet
    				))
    			{
    				DWORD error = GetLastError( );
    				if(error == ERROR_INSUFFICIENT_BUFFER)
    				{
    					ptOwner = (PTOKEN_OWNER)calloc(dwRet,1);
    					if(!GetTokenInformation(hToken,
    						TokenOwner,
    						ptOwner,
    						dwRet,
    						&dwRet
    						))
    					{
    						MessageBox(0,TEXT("获取TokenOwner信息失败"),0,0);
    						return ;
    					}
    					goto SUCCESS_TokenOwner;
    				}
    				MessageBox(0,TEXT("获取TokenOwner信息失败"),0,0);
    				return ;
    			}
    		SUCCESS_TokenOwner:;
    			LPTSTR lpszSID = NULL;
    			ConvertSidToStringSid(ptOwner->Owner,&lpszSID);
    			_tprintf(TEXT("OWNER SID: %s\t"),lpszSID);
    			TCHAR name[MAX_PATH] = {0};
    			DWORD len1 = MAX_PATH;
    			DWORD len2 = MAX_PATH;
    			TCHAR domain[MAX_PATH] = {0};
    			SID_NAME_USE pnu;
    			LookupAccountSid(NULL,ptOwner->Owner,name,&len1,domain,&len2,&pnu);
    			_tprintf(TEXT("OWNER NAME: %s of domain %s\n"),name,domain);
    			LocalFree(lpszSID);
    			free(ptOwner);
    			_tprintf(TEXT("****************************************************************************************************\n"));
    			_tprintf(TEXT("****************************************************************************************************\n\n\n"));
    			
    		}
    		break;
    
    		case TokenPrimaryGroup:
    		{
    			PTOKEN_PRIMARY_GROUP ppg = NULL;
    			DWORD dwRet = 0;
    			if(!GetTokenInformation(hToken,
    				TokenPrimaryGroup,
    				ppg,
    				dwRet,
    				&dwRet
    				))
    			{
    				DWORD error = GetLastError( );
    				if(error == ERROR_INSUFFICIENT_BUFFER)
    				{
    					ppg = (PTOKEN_PRIMARY_GROUP)calloc(dwRet,1);
    					if(!GetTokenInformation(hToken,
    						TokenPrimaryGroup,
    						ppg,
    						dwRet,
    						&dwRet
    						))
    					{
    						MessageBox(0,TEXT("获取TokenPrimaryGroup信息失败"),0,0);
    						return ;
    					}
    					goto SUCCESS_TokenPrimaryGroup;
    				}
    				MessageBox(0,TEXT("获取TokenPrimaryGroup信息失败"),0,0);
    				return ;
    			}
    		SUCCESS_TokenPrimaryGroup:;
    			LPTSTR lpszSID = NULL;
    			ConvertSidToStringSid(ppg->PrimaryGroup,&lpszSID);
    			_tprintf(TEXT("PRIMARY GROUP SID: %s\t"),lpszSID);
    			TCHAR name[MAX_PATH] = {0};
    			DWORD len1 = MAX_PATH;
    			DWORD len2 = MAX_PATH;
    			TCHAR domain[MAX_PATH] = {0};
    			SID_NAME_USE pnu;
    			LookupAccountSid(NULL,ppg->PrimaryGroup,name,&len1,domain,&len2,&pnu);
    			_tprintf(TEXT("GROUP NAME: %s of domain %s\n"),name,domain);
    			LocalFree(lpszSID);
    			free(ppg);
    			_tprintf(TEXT("****************************************************************************************************\n"));
    			_tprintf(TEXT("****************************************************************************************************\n\n\n"));
    		}
    		break;
    
    		case TokenDefaultDacl:
    		break;
    
    		case TokenSource:
    		{
    			PTOKEN_SOURCE pts = NULL;
    			DWORD dwRet = 0;
    			if(!GetTokenInformation(hToken,
    				TokenSource,
    				pts,
    				dwRet,
    				&dwRet
    				))
    			{
    				DWORD error = GetLastError( );
    				if(error == ERROR_INSUFFICIENT_BUFFER)
    				{
    					pts = (PTOKEN_SOURCE)calloc(dwRet,1);
    					if(!GetTokenInformation(hToken,
    						TokenSource,
    						pts,
    						dwRet,
    						&dwRet
    						))
    					{
    						MessageBox(0,TEXT("获取TokenSource信息失败"),0,0);
    						return ;
    					}
    					goto SUCCESS_TokenSource;
    				}
    				MessageBox(0,TEXT("获取TokenSource信息失败"),0,0);
    				return ;
    			}
    		SUCCESS_TokenSource:;
    			printf("Token Source NAME: %s\n",pts->SourceName);
    			free(pts);
    			_tprintf(TEXT("****************************************************************************************************\n"));
    			_tprintf(TEXT("****************************************************************************************************\n\n\n"));
    		}
    		break;
    
    		case TokenType:
    		{
    			PTOKEN_TYPE ptt = NULL;
    			DWORD dwRet = 0;
    			if(!GetTokenInformation(hToken,
    				TokenType,
    				ptt,
    				dwRet,
    				&dwRet
    				))
    			{
    				DWORD error = GetLastError( );
    				if(error == ERROR_INSUFFICIENT_BUFFER)
    				{
    					ptt = (PTOKEN_TYPE)calloc(dwRet,1);
    					if(!GetTokenInformation(hToken,
    						TokenType,
    						ptt,
    						dwRet,
    						&dwRet
    						))
    					{
    						MessageBox(0,TEXT("获取TokenType信息失败"),0,0);
    						return ;
    					}
    					goto SUCCESS_TokenType;
    				}
    				MessageBox(0,TEXT("获取TokenType信息失败"),0,0);
    				return ;
    			}
    		SUCCESS_TokenType:
    			_tprintf(TEXT("Token Type: %s\n"),(*ptt) == TokenPrimary?TEXT("TokenPrimary"):TEXT("TokenImpersonation"));
    			free(ptt);
    			_tprintf(TEXT("****************************************************************************************************\n"));
    			_tprintf(TEXT("****************************************************************************************************\n\n\n"));
    		}
    		break;
    
    		case TokenImpersonationLevel:
    		{
    			PSECURITY_IMPERSONATION_LEVEL psil = NULL;
    			DWORD dwRet = 0;
    			if(!GetTokenInformation(hToken,
    				TokenImpersonationLevel,
    				psil,
    				dwRet,
    				&dwRet
    				))
    			{
    				DWORD error = GetLastError( );
    				if(error == ERROR_INSUFFICIENT_BUFFER)
    				{
    					psil = (PSECURITY_IMPERSONATION_LEVEL)calloc(dwRet,1);
    					if(!GetTokenInformation(hToken,
    						TokenImpersonationLevel,
    						psil,
    						dwRet,
    						&dwRet
    						))
    					{
    						MessageBox(0,TEXT("获取TokenImpersonationLevel信息失败"),0,0);
    						return ;
    					}
    					goto SUCCESS_TokenImpersonationLevel;
    				}
    				MessageBox(0,TEXT("获取TokenImpersonationLevel信息失败,可能原因: 该Token不是Impersonation Token"),0,0);
    				
    				return ;
    			}
    			SUCCESS_TokenImpersonationLevel:
    			if((*psil) == SecurityAnonymous)
    				_tprintf(TEXT("TokenImpersonationLevel : %s"),TEXT("SecurityAnonymous"));
    			else if((*psil) == SecurityIdentification)
    				_tprintf(TEXT("TokenImpersonationLevel : %s"),TEXT("SecurityIdentification"));
    			else if((*psil) == SecurityImpersonation)
    				_tprintf(TEXT("TokenImpersonationLevel : %s"),TEXT("SecurityImpersonation"));
    			else
    				_tprintf(TEXT("TokenImpersonationLevel : %s"),TEXT("SecurityDelegation"));
    			free(psil);
    			_tprintf(TEXT("****************************************************************************************************\n"));
    			_tprintf(TEXT("****************************************************************************************************\n\n\n"));
    		}
    		break;
    
    		case TokenStatistics:
    		break;
    
    		case TokenRestrictedSids:
    		break;
    
    		case TokenSessionId:
    		{
    			DWORD dwSessionID = 0;
    			DWORD dwRet = sizeof(dwSessionID);
    			if(!GetTokenInformation(hToken,
    				TokenSessionId,
    				&dwSessionID,
    				dwRet,
    				&dwRet
    				))
    			{
    		
    				MessageBox(0,TEXT("获取TokenSessionId信息失败"),0,0);
    				return ;
    			}
    			_tprintf(TEXT("Session ID is %08X\n"),dwSessionID);
    			_tprintf(TEXT("****************************************************************************************************\n"));
    			_tprintf(TEXT("****************************************************************************************************\n\n\n"));
    		}
    		break;
    
    		case TokenGroupsAndPrivileges:
    		break;
    
    		case TokenSandBoxInert:
    		break;
    
    		case TokenOrigin:
    		break;
    
    		case TokenElevationType:
    		break;
    
    		case TokenLinkedToken:
    		break;
    
    		case TokenElevation:
    		break;
    
    		case TokenHasRestrictions:
    		break;
    
    		case TokenAccessInformation:
    		break;
    
    		case TokenVirtualizationAllowed:
    		break;
    
    		case TokenVirtualizationEnabled:
    		break;
    
    		case TokenIntegrityLevel:
    		break;
    
    		case TokenUIAccess:
    		break;
    
    		case TokenMandatoryPolicy:
    		break;
    
    		case TokenLogonSid:
    		break;
    
    		case TokenCapabilities:
    		break;
    
    		case TokenUserClaimAttributes:
    		break;
    
    		case TokenDeviceClaimAttributes:
    		break;
    
    		case TokenDeviceGroups:
    		break;
    
    		case TokenRestrictedDeviceGroups:
    		break;
    	}
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	HANDLE hToken = NULL;
    	if(!OpenProcessToken(GetCurrentProcess( ),TOKEN_ALL_ACCESS,&hToken))
    	{
    		MessageBox(0,TEXT("Token获取失败"),0,0);
    		return 0;
    	}
    	TOKEN_INFORMATION_CLASS tic[31] = {
    		TokenUser,
    		TokenGroups,
    		TokenPrivileges,
    		TokenOwner,
    		TokenPrimaryGroup,
    		TokenDefaultDacl,
    
    		TokenSource,
    		TokenType,
    		TokenImpersonationLevel,
    		TokenStatistics,
    		TokenRestrictedSids,
    
    		TokenSessionId,
    		TokenGroupsAndPrivileges,
    		TokenSandBoxInert,
    		TokenOrigin,
    		TokenElevationType,
    
    		TokenLinkedToken,
    		TokenElevation,
    		TokenHasRestrictions,
    		TokenAccessInformation,
    		TokenVirtualizationAllowed,
    
    		TokenVirtualizationEnabled,
    		TokenIntegrityLevel,
    		TokenUIAccess,
    		TokenMandatoryPolicy,
    		TokenLogonSid,
    
    		TokenCapabilities,
    		TokenUserClaimAttributes,
    		TokenDeviceClaimAttributes,
    		TokenDeviceGroups,
    		TokenRestrictedDeviceGroups
    	};
    	const int total = 31;
    	for(int i = 0; i < total; i++) 
    		PrintTokenInfoXX(hToken,tic[i]);
    	return 0;
    }
    



    展开全文
  • 之后他继续提问,当你登录成功后,去请求购物车时,后台为什么会返回的是你的购物车,而不是别人的?不是匹配用户id吗??我还没领悟到面试官想让我回答的是Token。。。。参考链接:https://juejin.i...
  • 什么token

    2022-01-15 21:08:13
    token验证(包含部分信息的加密字符串) 1、Token的引入:Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,...
  • 欢迎关注文章系列 ,关注我... 大爷:马都什么? 夏洛:马冬梅。 6 7大爷:什么都没啊? 8 9夏洛:马冬梅啊。 10 11大爷:马什么没? 12 13夏洛:行,大爷你先凉快着吧。 复制代码在了解这三个概念之前我们先...
  • Token介绍

    2019-08-14 18:58:41
    Token在web程序中,它是服务端生成的一串字符串,作为客户端进行请求的一个标识
  • 既然前面有说到spring security 是如何验证当前用户以及获取到当前用户信息,哪么spring security auth2.0又是如何验证当前用户信息的呢? 技术详解: spring security auth2.0验证用户信息其实更加简单,具体的...
  • Token的常用实现方式

    千次阅读 2021-08-12 03:05:22
    简述通常的Token在服务器端的实现方式有这几个:用SessionID实现Token的功能生成Token存在数据库(关系型数据库)生成Token存在Redis(非关系型数据库)使用Json Web Token (JWT)下面分析一下各个存储方式的优缺点...
  • Web中什么token,token的组成部分详解(jwt Token

    千次阅读 多人点赞 2019-04-26 14:00:57
    token是计算机术语:令牌,令牌是一种能够控制站点占有媒体的特殊帧,以区别数据帧及其他控制帧。token其实说的更通俗点可以叫暗号,在一些数据传输之前,要先进行暗号的核对,不同的暗号被授权不同的数据操作。 ...
  • JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。 JWT 本质...
  • 什么token 是计算机术语:令牌,令牌是一种能够控制站点占有媒体的特殊帧,以区别数据帧及其他控制帧。token其实说的更通俗点可以叫暗号,在一些数据传输之前,要先进行暗号的核对,不同的暗号被授权不同的数据...
  • Token-简单使用

    2021-08-23 21:59:37
    Token-简单使用 (1)登录 -> 后端服务 -> 生成令牌(sajkbcjy123nmb) -> 存入Redis缓存数据库中(30分钟) -> 响应生成的令牌给前端 (2)前端请求(携带令牌) -> 后端服务 -> Redis缓存(判断令牌...
  • 计算机领域中的token的意思

    千次阅读 2019-09-23 08:19:16
    这里转载两篇文章,解释了什么token,他有多个意思。...令牌(信息安全术语)Token, 令牌,代表执行某些操作的权利的对象访问令牌(Access token)表示访问控制操作主体的系统对象邀请码,在邀请系统中使用Toke...
  • 使用token验证登录信息,把生成的token存到数据库中,根据用户id判断是否重复登录,重复登录就重置到期时间 调用登录接口返回出token和uuid信息 每次访问都需要在Headers里面添加该数据,adminId对应就是uuid的...
  • 我遇到了一个问题,不知道怎么解决,就是前端把Token放在了请求头里面,我后台不知道怎么从请求头里面token拿出来解析,我用Asp.net框架,希望能说明一哈哈,我百度了一下 发现他们说的都的有点关于这方面的基础...
  • 我们用JWT首先要知道什么是JWT? JSON Web Token(JWT)是一个非常轻巧的规范。 这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。 JWT的组成 一个JWT实际上就是一个字符串,它由三部分组成,头部...
  • 使用JWT生成token实现权限验证

    千次阅读 2022-03-28 23:33:22
    而且这些数据是存在 token 里面的,由前端携带,所以后端几乎不需要保存任何数据。 例如: { "uid": "xxxxidid", //用户id "exp": "12121212" //过期时间 } 签名:1.头部和载荷 各自base64加密后用.连接起来,然后就...
  • ticket、token、RPC是什么

    千次阅读 2020-08-19 08:52:57
    sso技术中ticket和cookie的区别token什么意思?什么是http接口?API 是什么ticket机制rpc是什么 SSO技术中ticket和cookie有什么区别? 其实无论是ticket还是cookie,都是验证信息的一种具体表现。 cookie是具体指...
  • 可以控制给这个客户端生成的token有哪些权限2,在客户端,申请令牌的时候,可以指定scope示例:在资源服务器 (nb-order-api)里,控制post请求的token ,其scope必须包含write权限,get请求的token必须包含read权限。...
  • 二、JWT是什么JWT一看就是简称,它的全称JSON Web Token,从字面上我们看出1、数据是JSON格式2、用于Web应用3、是一个Token,也就是一个令牌方式看看官方的说明,它定义了一种紧凑且自包含的方式,用于在各方之间以...
  • 前端token什么?怎么进行封装使用

    多人点赞 2022-04-08 15:44:30
    token的使用和封装
  • Cookie,Session、Token什么、区别在哪?一、HTTP协议深入讲解及它的特点1.1 HTTP协议1.2 http协议特点1.3 同步、异步请求二、Cookie以及Cookie鉴权的原理2.1 什么是Cookie2.2 Cookie的作用2.3 怎么查看Cookie2.4 ...
  • var token='dcvuahsdnfajw12kjfasfsdf34' send发送数据 var ws = new WebSocket("ws://" + url + "/webSocketServer"); ws.onopen=function(){ ws.send(token) } 请求地址中带参数 var ws = new WebSocket(
  • 1、JWT简介JSON Web Token(缩写 JWT),是目前最流行的跨域认证解决方案。session登录认证方案:用户从客户端传递用户名、密码等信息,服务端认证后将信息存储在session中,将session_id放到cookie中。以后访问其他...
  • 前言: 在测试工作中,我们经常会遇到,在执行某项业务之前,必须要先登录,只有登录后才能执行某项业务工作的场景,比如:你必须登录后才能执行查询操作,你...用于储存请求时要包含信息头,其中就包含token ...
  • 借鉴参考Java Token登录验证 使用jjwt生成和解析JWTjava基于token验证之登陆验证等什么Token?我的理解来说 token就是你访问服务器的口令,只要token合法,正确,你就能获取到后端数据当用户第一次登陆后,用户名...
  • websocket 里面添加 Token

    千次阅读 2019-07-13 22:40:00
    websocket请求头中可以包含Sec-WebSocket-Protocol这个属性,该属性是一个自定义的子协议。它从客户端发送到服务器并返回从服务器到客户端确认子协议。我们可以利用这个属性添加token。 let ws = new WebSocket...
  • JWT生成的Token是一个用两个点(.)分割的长字符串; 分割成的三部分分别是Header头部,Payload负载,Signature签名 即 Header.Payload.Signature JWT是不加密的,任何人都可以读的到其中的信息,其中第一部分 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 79,002
精华内容 31,600
关键字:

token里面包含什么信息