auth.js 3.8 KB

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