这里的代码都是源项目中的代码,示例项目sample文件夹下的代码,或者test文件夹下的代码。
nancy中的Stateless验证的实现 ,示例中的方法要比token简单容易看的多。不像token中的FileSystemTokenKeyStore方式,用文件保存,每次全部读取,实现也麻烦。
StatelessAuthBootstrapper 是sample中的用来演示用的自定义代码,实现了DefaultNancyBootstrapper。
var apiKey = (string) nancyContext.Request.Query.ApiKey.Value;
//get the user identity however you choose to (for now, using a static class/method)
return UserDatabase.GetUserFromApiKey(apiKey);
每次获取apikey 然后获取用户信息。
现在转到UserDatabase的类,
static readonly List<Tuple<string, string>> ActiveApiKeys = new List<Tuple<string, string>>();
private static readonly List<Tuple<string, string>> Users = new List<Tuple<string, string>>();
定义了2个list,Users代表我们的数据库的用户表,保存用户的信息等。
ActiveApiKeys 用来保存登陆后的apikey等,类似早期的保存的session的库,只不过早期通常是服务器进程自动维护。这里我们可以用memcache,或者redis来代替。
在ValidateUser的方法中,有这么一句 var apiKey = Guid.NewGuid().ToString(); 用来产生apikey。 一般guid足够了,当然你也可以把它进行加密,就会更加碰撞不到了。
DemoUserIdentity 的属性比较少,可以自己添加角色等要用来验证的必要信息。
ActiveApiKeys 也可以用自己的方式来验证,反正Tuple可以加7个参数的内容,下面是token方式验证中的Tokenizer类,里面包含的部分字段。 我们也可以这样去做,
例如加入apikey的过期时间,验证时可以直接设置apikey过期。
加入刷新apikey时间,在apikey过期的时候,例如30秒内,可以用旧的的apikey交换新的apikey。类似taobao的刷新token。
private Encoding encoding = Encoding.UTF8;
private string claimsDelimiter = "|";
private string hashDelimiter = ":";
private string itemDelimiter = Environment.NewLine;
private Func<DateTime> tokenStamp = () => DateTime.UtcNow;
private Func<DateTime> now = () => DateTime.UtcNow;
private Func<TimeSpan> tokenExpiration = () => TimeSpan.FromDays(1);
private Func<TimeSpan> keyExpiration = () => TimeSpan.FromDays(7);