auth.js 3.6 KB

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