auth.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. const Response = require('../util/response');
  2. const jwt = require('jsonwebtoken');
  3. class AuthController{
  4. static checkClient(ctx){
  5. const allowed_client_ids = ['seec-portal', 'seec-seec', 'seec-mooc', 'seec-helper'];
  6. const allowed_redirect_domains = ['localhost:3000', 'localhost:8000', 'p.seecoder.cn', 'seec.seecoder.cn', 'mooc.seecoder.cn', 'helper.seecoder.cn' ];
  7. const query = ctx.query;
  8. console.log('query', query);
  9. const {client_id, redirect_uri, scope} = query;
  10. if(!client_id || !redirect_uri || !scope){
  11. ctx.body=Response.failed("非法请求,拒绝访问");
  12. }
  13. else if(allowed_client_ids.indexOf(client_id) < 0 || scope !== "openid" || (redirect_uri.indexOf('https://')!==0 && redirect_uri.indexOf('http://')!==0) ){
  14. ctx.body=Response.failed("非法请求,拒绝访问");
  15. }
  16. else{
  17. let durl=/http:\/\/([^\/]+)\//i;
  18. let domain = redirect_uri.match(durl)[1];
  19. // console.log('domain',domain);
  20. if(allowed_redirect_domains.indexOf(domain) < 0){
  21. ctx.body=Response.failed("非法请求,拒绝访问");
  22. }else{
  23. ctx.cookies.set('redirect_uri', redirect_uri, {
  24. maxAge:60*1000*3
  25. });
  26. ctx.cookies.set('client_id', client_id, {
  27. maxAge:60*1000*3
  28. });
  29. ctx.redirect("/login");
  30. }
  31. }
  32. }
  33. static processIDToken(ctx){
  34. const query = ctx.query;
  35. const {id_token} = query;
  36. if(!id_token){
  37. ctx.body = Response.failed("非法请求!")
  38. }else{
  39. jwt.verify(id_token, 'SEEC-1919810-OIDC-114514', (err, authData) => {
  40. if(err) {
  41. console.log("err:", err);
  42. ctx.redirect("/error");
  43. }
  44. else {
  45. const { iss, sub, aud, auth_time, iat, exp} = authData;
  46. if(!iss || !sub || !aud || !auth_time || !iat || !exp){
  47. ctx.redirect("/error");
  48. }
  49. else if(iss !== "p.seecoder.cn" || aud!=='seec-portal' ){
  50. ctx.redirect("/error");
  51. }
  52. else{
  53. let claims = sub.split('%26');
  54. let user = {
  55. id: parseInt(claims[0]),
  56. name: claims[1],
  57. phone: claims[2]
  58. };
  59. let my_token = jwt.sign(
  60. user,'seec-portal',{ expiresIn: '1day' }
  61. );
  62. console.log('ctx', ctx);
  63. // console.log('$cookies', ctx.app.$cookies);
  64. // ctx.res.setHeader("Access-Control-Allow-Origin", "http://localhost:3000");
  65. // ctx.res.setHeader("Access-Control-Allow-Credentials", true);
  66. // ctx.cookies.user = user;
  67. // ctx.cookies.token = my_token;
  68. //
  69. // console.log("origin_path", origin_path)
  70. //
  71. // ctx.redirect(origin_path);
  72. let url = '/setToken?token=' + my_token + '&id=' + user.id + '&name=' + user.name + '&phone=' + user.phone;
  73. // store.commit("saveUser", user);
  74. // store.commit("saveToken", my_token);
  75. ctx.redirect(url);
  76. }
  77. }
  78. });
  79. }
  80. }
  81. static authenticate(ctx){
  82. const query = ctx.query;
  83. let return_uri = encodeURIComponent(ctx.origin+"/api/receiveIDToken");
  84. let url = ctx.origin+'/api/interaction?'+
  85. 'client_id='+ 'seec-portal' +
  86. '&scope=openid' +
  87. '&redirect_uri=' + return_uri;
  88. console.log("redirect to " + url);
  89. return ctx.redirect(url);
  90. }
  91. }
  92. module.exports = AuthController;