Project

General

Profile

1
package eu.dnetlib.openaire.user.security;
2

    
3
import com.google.gson.JsonObject;
4
import eu.dnetlib.openaire.user.MigrationUser;
5
import io.jsonwebtoken.Claims;
6
import io.jsonwebtoken.Jwts;
7
import io.jsonwebtoken.SignatureAlgorithm;
8
import org.apache.log4j.Logger;
9
import org.mitre.openid.connect.model.OIDCAuthenticationToken;
10
import org.mitre.openid.connect.model.UserInfo;
11

    
12
import java.io.UnsupportedEncodingException;
13
import java.net.URLEncoder;
14
import java.text.ParseException;
15
import java.util.Date;
16

    
17
public class JWTGenerator {
18

    
19
    private static final Logger logger = Logger.getLogger(JWTGenerator.class);
20

    
21
    public static String generateToken(MigrationUser u, String secret) {
22
        Claims claims = Jwts.claims().setSubject(u.getUsername());
23
        claims.put("fullname", u.getFullname() + "");
24
        claims.put("userId", u.getId() + "");
25
        claims.put("email", u.getEmail() + "");
26
        claims.put("role", u.getRoleId());
27

    
28
        //expiration
29
        long nowMillis = System.currentTimeMillis();
30
        Date now = new Date(nowMillis);
31
        long ttlMillis = 1800000;
32
        long expMillis = nowMillis + ttlMillis;
33
        Date exp = new Date(expMillis);
34

    
35
        return Jwts.builder()
36
                .setClaims(claims)
37
                .setExpiration(exp)
38
                .signWith(SignatureAlgorithm.HS512, secret)
39
                .compact();
40
    }
41

    
42
    public static String generateToken(OIDCAuthenticationToken authOIDC, String secret) {
43

    
44
        try {
45

    
46
            JsonObject userInfo = authOIDC.getUserInfo().getSource();
47
            Claims claims = Jwts.claims().setSubject(authOIDC.getUserInfo().getSub());
48
            claims.put("fullname", URLEncoder.encode(authOIDC.getUserInfo().getName(), "UTF-8") + "");
49

    
50
            if (authOIDC.getUserInfo().getGivenName() == null){
51
                logger.info("User: " + authOIDC.getUserInfo().getName() + "doesn't have first name");
52
                claims.put("firstname", URLEncoder.encode("", "UTF-8") + "");
53
            } else {
54
                claims.put("firstname", URLEncoder.encode(authOIDC.getUserInfo().getGivenName(), "UTF-8") + "");
55

    
56
            }
57
            if (authOIDC.getUserInfo().getFamilyName() == null){
58
                logger.info("User: " + authOIDC.getUserInfo().getName() + "doesn't have first name");
59
                claims.put("lastname", URLEncoder.encode("", "UTF-8") + "");
60
            } else {
61
                claims.put("lastname", URLEncoder.encode(authOIDC.getUserInfo().getFamilyName(), "UTF-8") + "");
62

    
63
            }
64
            claims.put("email", authOIDC.getUserInfo().getEmail() + "");
65
//            claims.put("role", URLEncoder.encode(userInfo.getAsJsonArray("edu_person_entitlements").toString(), "UTF-8") + "");
66
//
67

    
68
//            if (userInfo.getAsJsonArray("eduPersonScopedAffiliation").toString() != null) {
69
//                claims.put("role", URLEncoder.encode(userInfo.getAsJsonArray("edu_person_scoped_affiliations").toString(), "UTF-8") + "");
70
//            }
71

    
72
            if (userInfo.getAsJsonArray("edu_person_entitlements") == null){
73
                logger.info("User: " + authOIDC.getUserInfo().getName() + "doesn't have role");
74
                claims.put("role", URLEncoder.encode("", "UTF-8") + "");
75
            } else {
76
                claims.put("role", URLEncoder.encode(userInfo.getAsJsonArray("edu_person_entitlements").toString(), "UTF-8") + "");
77
            }
78

    
79
            //TODO remove, We don't need it but if we are going to use it, we need to check if the user has affiliation
80
            //claims.put("edu_person_scoped_affiliations", URLEncoder.encode(userInfo.getAsJsonArray("edu_person_scoped_affiliations").toString(), "UTF-8") + "");
81

    
82
            //TODO remove
83
            //TODO THIS IS TEST
84
//            claims.put("fullname", URLEncoder.encode("Σοφία Μπαλτζή", "UTF-8") + "");
85
//            claims.put("firstname", URLEncoder.encode("Σοφία", "UTF-8") + "");
86
//            claims.put("lastname", URLEncoder.encode("Μπαλτζή", "UTF-8") + "");
87
//            claims.put("email", "sofie.mpl@gmail.com" + "");
88
//            claims.put("edu_person_scoped_affiliations", "faculty");
89

    
90
            Date exp = new Date(authOIDC.getIdToken().getJWTClaimsSet().getExpirationTime().getTime());
91

    
92
            //TODO DELETE LOGS
93
//            logger.info("\n////////////////////////////////////////////////////////////////////////////////////////////////\n");
94
//            logger.info("fullName: " + authOIDC.getUserInfo().getName());
95
//            logger.info("firstName: " + authOIDC.getUserInfo().getGivenName());
96
//            logger.info("lastName: " + authOIDC.getUserInfo().getFamilyName());
97
//            logger.info("email: " + authOIDC.getUserInfo().getEmail());
98
//            //logger.info("Check everything");
99
//            logger.info("locale: " + authOIDC.getUserInfo().getSource());
100
//            logger.info("role: " + userInfo.getAsJsonArray("edu_person_entitlements").toString());
101
//            //logger.info("affiliation: " + userInfo.getAsJsonArray("edu_person_scoped_affiliations").toString());
102
//            logger.info("expirationTime: " + exp);
103
//            logger.info("\n////////////////////////////////////////////////////////////////////////////////////////////////\n");
104

    
105
            return Jwts.builder()
106
                    .setClaims(claims)
107
                    .setExpiration(exp)
108
                    .signWith(SignatureAlgorithm.HS512, secret)
109
                    .compact();
110

    
111
        } catch (ParseException e) {
112
            e.printStackTrace();
113
            logger.error("JWT Parse Exception from getting Expiration Time ", e);
114
            return "error";
115
        } catch (UnsupportedEncodingException e) {
116
            e.printStackTrace();
117
            logger.error("UnsupportedEncodingException UTF-8 ", e);
118
            return "error";
119
        }
120
    }
121

    
122
    //TODO DELETE IF IT IS NOT NECESSARY
123
    public static String generateAccessToken(OIDCAuthenticationToken authOIDC, String secret) {
124
        Claims claims = Jwts.claims().setId(authOIDC.getAccessTokenValue());
125

    
126
        //TODO DELETE LOGS
127
        logger.info("\n////////////////////////////////////////////////////////////////////////////////////////////////\n");
128
        logger.info("access token: " + authOIDC.getAccessTokenValue());
129
        logger.info("\n////////////////////////////////////////////////////////////////////////////////////////////////\n");
130

    
131
        return Jwts.builder()
132
                .setClaims(claims)
133
                .signWith(SignatureAlgorithm.HS512, secret)
134
                .compact();
135
    }
136

    
137

    
138
    public static String generateToken(UserInfo user, String secret) {
139
        try {
140

    
141
            JsonObject userInfo = user.getSource();
142

    
143
        Claims claims = Jwts.claims().setSubject(user.getSub());
144
        claims.put("email", user.getEmail() + "");
145
            claims.put("role", URLEncoder.encode(userInfo.getAsJsonArray("edu_person_entitlements").toString(), "UTF-8") + "");
146

    
147
        return Jwts.builder()
148
                .setClaims(claims)
149
                .signWith(SignatureAlgorithm.HS512, secret)
150
                .compact();
151
        } catch (UnsupportedEncodingException e) {
152
            e.printStackTrace();
153
            logger.error("UnsupportedEncodingException UTF-8 ", e);
154
            return "error";
155
        }
156
    }
157

    
158
}
159

    
160

    
161

    
162
// How to add it manually
163
//        long nowMillis = System.currentTimeMillis();
164
//        //This is my token
165
//        try {
166
//            String jwt = Jwts.builder()
167
//                    .setSubject("Argiro")
168
//                    .setExpiration(new Date(nowMillis+1800000))
169
//                    .claim("fullname", "Argiro Kokogianaki")
170
//                    .claim("id", "8")
171
//                    .claim("email", "argiro@gmail.com")
172
//                    .claim("role","2")
173
//                    .signWith(
174
//                            SignatureAlgorithm.HS512,
175
//                            "my-very-secret".getBytes("UTF-8")
176
//                    )
177
//                    .compact();
(2-2/2)