-
Notifications
You must be signed in to change notification settings - Fork 70
/
oauth2_token.erl
66 lines (58 loc) · 2.47 KB
/
oauth2_token.erl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
%% ----------------------------------------------------------------------------
%%
%% oauth2: Erlang OAuth 2.0 implementation
%%
%% Copyright (c) 2012 KIVRA
%%
%% Permission is hereby granted, free of charge, to any person obtaining a
%% copy of this software and associated documentation files (the "Software"),
%% to deal in the Software without restriction, including without limitation
%% the rights to use, copy, modify, merge, publish, distribute, sublicense,
%% and/or sell copies of the Software, and to permit persons to whom the
%% Software is furnished to do so, subject to the following conditions:
%%
%% The above copyright notice and this permission notice shall be included in
%% all copies or substantial portions of the Software.
%%
%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
%% FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
%% DEALINGS IN THE SOFTWARE.
%%
%% ----------------------------------------------------------------------------
-module(oauth2_token).
-include("oauth2.hrl").
%%% API
-export([
generate/0
]).
%%%===================================================================
%%% API functions
%%%===================================================================
%% @doc Generates a random OAuth2 token.
-spec generate() -> Token :: oauth2:token().
generate() ->
generate_fragment(?TOKEN_LENGTH).
%%%===================================================================
%%% Internal functions
%%%===================================================================
-spec generate_fragment(N :: integer()) -> binary().
generate_fragment(0) ->
<<>>;
generate_fragment(N) ->
Rand = base64:encode(crypto:rand_bytes(N)),
Frag = << <<C>> || <<C>> <= <<Rand:N/bytes>>, is_alphanum(C) >>,
<<Frag/binary, (generate_fragment(N - byte_size(Frag)))/binary>>.
%% @doc Returns true for alphanumeric ASCII characters, false for all others.
-spec is_alphanum(Char :: char()) -> boolean().
is_alphanum(C) when C >= 16#30 andalso C =< 16#39 ->
true;
is_alphanum(C) when C >= 16#41 andalso C =< 16#5A ->
true;
is_alphanum(C) when C >= 16#61 andalso C =< 16#7A ->
true;
is_alphanum(_) ->
false.